home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 095 / 151b_src.arc / RBBSSUB2.BAS < prev    next >
BASIC Source File  |  1987-06-07  |  152KB  |  3,820 lines

  1. ' $linesize:132
  2. ' $title: 'RBBSSUB2.BAS CPC15-1B, Copyright 1986 & 87 by D. Thomas Mack'
  3. '  Copyright 1987 by D. Thomas Mack, all rights reserved.
  4. '  Name ...............: RBBSSUB2.BAS
  5. '  Written by .........: D. Thomas Mack
  6. '  First Released .....: June 29, 1986
  7. '  Subsequent Releases.: September 28, 1986, March 15, 1987, June 7, 1987
  8. '  Copyright ..........: 1986, 1987
  9. '  Purpose.............: The Remote Bulletin Board System for the IBM PC,
  10. '                        RBBS-PC.BAS utilizes a lot of common subroutines.
  11. '                        Those that do not reqpure error trapping are
  12. '                        incorporated within RBBSSUB2.BAS as separately call-
  13. '                        able subroutines in order to free up as much code as
  14. '                        possible within the 64K code segment used by
  15. '                        RBBS-PC.BAS.
  16. '  Parameters..........: Most parameters are passed via a COMMON statement.
  17. '
  18. ' Subroutine  Line               Function of Subroutine
  19. '   Name     Number
  20. '  ALLCAPS    58060   Convert a string to all upper case characters
  21. '  ALLCAPSD   58065   Convert a dimensioned string to all upper case characters
  22. '  AMORPM     41500   Calculate the current time as AM or PM
  23. '  BADCHAR      455   Check user name for invalid characters
  24. '  BADFILE    20741   Check for system crash attempt with bad device name
  25. '  BADNAME    20235   Check for system crash attempt with bad file name
  26. '  BRKFNAME   20282   Break a file name into it's component parts
  27. '  BUFFILE    58400   Write a file to the user quickly
  28. '  BUFSTRNG   58300   Write a string with imbedded CR/LF to the user quickly
  29. '  CALLOPT    58090   Set prompts based on the user's security
  30. '  CARRIER    42000   Test for Carrier present
  31. '  CHECKTIM   58070   Test to insure that users don't exceed their time
  32. '  CHKNARY    58180   Check for the occurance of a string in an array
  33. '  CHKNEWBUL  58110   Check for new bulletins based on their file creation date
  34. '  COMMINFO   44000+  Get users baud rate and parity in a string format
  35. '  COMPDATE   59200+  Produces a computational data from YY, MM, DD
  36. '  CONVDIRS   58950   Checks for U & A (shorthand) and converts appropriately
  37. '  COPYWRIT      97   Display RBBS-PC's copyright notice
  38. '  CTNEWFILES 58150   Check for number of files uploaded after a specific date
  39. '  CTLINES    58160   Find the number of entries in the upload management sys.
  40. '  DEFALTU     9600   Write out the user's defaults
  41. '  DELAYIT    50500   Wait number of seconds specified before returning
  42. '  DISPLAYTR  41010+  Compute and display time remaining
  43. '  DISUPDIR   58170   Display the shared directory of the FMS mng. sys. ' CPC15-1B
  44. '  DOOREXIT   10987   Set up a .BAT file to exit RBBS-PC and go to a "door"
  45. '  DOSEXIT    10934   Set up a .BAT file to exit to DOS (second level)
  46. '  FILELOCK   21995   Allow files to be shared among multiple RBBS-PC's
  47. '  FINDFUNC   58040   Find the function key, if any, that was depressed
  48. '  FINDLAST   58600   Finds last occurence of a string in a string
  49. '  FINDTIME   58050   Calculate the number of seconds since midnight
  50. '  FMS        58200   Search the upload management system for entries
  51. '  GETCOMND      97+  Get RBBS-PC's node id from command line
  52. '  GETDIRS    58900   Prompts for directories for file list/new/search cmds
  53. '  GETIME      9140   Calculates callers elapsed time (hours, minutes, seconds)
  54. '  GETYMD     59200   Pulls YY, MM, or DD from a 2 byte stored date
  55. '  GRAPHIC    43031   Determines whether graphic version of file exists
  56. '  HASHRBBS   58080   "Hash" to a user's record in the USERS file
  57. '  HELP        1330   Processes help command
  58. '  INSCOMMA   58130   Format commands in the command prompt
  59. '  INITFMS    58160+  Initialize the managment upload system
  60. '  KILLMSG     3955   Delete old or unnecessary messages
  61. '  LINE25       949   Build and/or update line 25 of RBBS-PC's local screen
  62. '  LOADNEW    58140   Find the latest uploads
  63. '  LOGERROR   13660   Log error message to CALLERS file
  64. '  MLINIT        50   Handle MultiLink initialization/de-initialization
  65. '  MODEMPUT   52070   Write a modem command string to the modem
  66. '  MUSIC      59100   Play musical themes for different RBBS functions
  67. '  OPENMSG    30500   Open the messages file as file number 1
  68. '  PROTOCOL   62600   Determine if external protocols are available
  69. '  PRTCRLF     1478   Write "snoop" lines that may have imbedded CR/LF's
  70. '  QTPUT       1477   Fast, but limited, "TPUT" equivalent
  71. '  RBBSEXIT   10992   Common RBBS-PC exit to transfer control to other programs
  72. '  READPROF   44000   Read user's profile on return from a "door"
  73. '  RECOVMSG   10410   Recover a deleted message
  74. '  REMOVE     58210   Remove characters from within strings
  75. '  ROTORSDIR  58700   Searches for a file using list of subdirs
  76. '  SAVEPROF   43070   Save the user's provile when exiting to "doors" or DOS
  77. '  SETBAUD     1654   Set baud rate in the 8250 chip of the RS232 interface
  78. '  SETCRLF     1496   Set up the necessary carriage return/line feed string
  79. '  SETOPTS    58100   Set correct prompt line for each subsystem
  80. '  SKIPLINE    1485   Write a # of blank lines to the communications port
  81. '  SRCHCMND    1240   Searches list of commands in RBBS for a request
  82. '  SRTSTRNG   58120   Sort characters in a string
  83. '  SYSMENU      112   Displays sysop menu/status
  84. '  TIMEREMAIN 41010   Compute time remaining in minutes
  85. '  TRANSFER   62620   RBBS-PC support for external protocols for file transfer
  86. '  TRIM          99   Strip leanding and trailing blanks from a string
  87. ' TWOBYTEDATE 59200   Reduces a data to 2 byte string for space compression
  88. '  UNTILRIGHT 12880   Ask a question until user says answer is right ' CPC15-1B
  89. '  UPDATEU    10600   Updates the user record on loging off/exiting RBBS-PC
  90. '  UPDTUPLOAD 20705   Updates upload directory file
  91. '  VIEWARC    64600   Display .ARC file contents to user
  92. '  WILDCARD   20285   Determines whether string matches a pattern
  93. '  WIPELINE   58800   Wipes away a line so next prints in its place
  94. '  WORDINFILE 10976   Find a whole word within a file/menu
  95. '
  96. '  $INCLUDE: 'RBBS-VAR.BAS'
  97. '
  98. '  $SUBTITLE: 'MLINIT - MultiLink initialization/deinitialization'
  99. '  $PAGE
  100. '
  101. '  SUBROUTINE NAME    -- MLINIT
  102. '
  103. '  INPUT PARAMETERS   --  MLPARM = 1             INITIALIZE AT STARTUP OR RE-
  104. '                                                CYLCE TIME
  105. '                         MLPARM = 2             DE-INITIALIZE ON EXITING TO
  106. '                                                A DOOR OR DOS REMOTELY
  107. '                         MLPARM = 3             DE-QUEUE COMMUNICATIONS PORTS
  108. '                         MLPARM = 4             CHECK FOR MULTILINK PRESENT
  109. '                         DOORS.TERMINAL.TYPE
  110. '                         BAUD.TEST
  111. '                         COM.PORT$
  112. '                         COMPUTER.TYPE
  113. '
  114. '  OUTPUT PARAMETERS  --  NONE
  115. '
  116. '  SUBROUTINE PURPOSE --  TO TEST FOR THE PRESENCE OF MULTI-LINK AND SET
  117. '                         MULTI LINK OPTIONS TO BE COMPATIBLE WITH RBBS-PC
  118. '
  119.       SUB MLINIT (MLPARM) STATIC
  120.     DEF SEG = 0
  121.     IF COMPUTER.TYPE = 1 _
  122.        GOTO 10
  123.     IF NOT MLCOM THEN _
  124.        IF NETWORK.TYPE <> 1 THEN _
  125.           GOTO 10
  126.     MULTI.LINK.PRESENT = PEEK(&H1FE) + 256*PEEK(&H1FF)
  127.     IF MULTI.LINK.PRESENT = 0 THEN _
  128.        GOTO 10
  129.     ON MLPARM GOSUB 30,20,60,10
  130. 10  DEF SEG
  131.     EXIT SUB
  132. 20  IF DOORS.TERMINAL.TYPE < 1 THEN _
  133.        RETURN
  134.     DEF SEG = MULTI.LINK.PRESENT
  135.     GOSUB 60
  136. '
  137. ' *****************************************************************************
  138. ' *                  MLUTIL BAUD n (where n = BAUD.TEST)                      *
  139. ' *****************************************************************************
  140. '
  141.     AX = &H600
  142.     BX = BAUD.TEST   ' Tell ML the baud rate
  143.     GOSUB 80
  144. '
  145. ' *****************************************************************************
  146. ' *                  MLUTIL TERM n (where n = DOORS.TERMINAL.TYPE)            *
  147. ' *****************************************************************************
  148. '
  149.     AX = &H700 + DOORS.TERMINAL.TYPE
  150.     GOSUB 80         ' Tell ML the terminal type
  151. '
  152. ' *****************************************************************************
  153. ' *                  MLINK /port                                              *
  154. ' *****************************************************************************
  155. '
  156. '                    ' Tell ML the communications port
  157.     POKE (&H64+PEEK(&H58)+256*PEEK(&H59)+&HC),ASC(RIGHT$(COM.PORT$,1))-48
  158. '
  159. ' *****************************************************************************
  160. ' *                  MLUTIL SCMON                                             *
  161. ' *****************************************************************************
  162. '
  163.     AX = &HB01
  164.     BX = 0           ' Tell ML to start monitoring the carrier
  165.     GOSUB 80
  166.     RETURN
  167. '
  168. ' *****************************************************************************
  169. ' *                  MLUTIL CCMON                                             *
  170. ' *****************************************************************************
  171. '
  172. 30  AX = &HB00       ' Turn off ML's carrier monitoring.
  173.     BX = 0
  174.     GOSUB 80
  175. '
  176. ' *****************************************************************************
  177. ' *                  MLUTIL TERM 1                                            *
  178. ' *****************************************************************************
  179. '
  180.     AX = &H701       ' Change terminal type to ML type 1.
  181.     BX = 0
  182.     GOSUB 80
  183. '
  184. ' *****************************************************************************
  185. ' *                  MLINK /port (where port = 9 if ML 3.03 or earlier        *
  186. ' *                                     port = 0 if ML 4.00 or greater        *
  187. ' *****************************************************************************
  188. '
  189.     DEF SEG = MULTI.LINK.PRESENT
  190.     MULTI.LINK.COM.PORT = (&H64 + PEEK(&H58) + 256*PEEK(&H59) + &HC)
  191.     MULTI.LINK.VERSION = PEEK(&H1) + 256*PEEK(&H2)
  192.     IF PEEK(MULTI.LINK.COM.PORT) = &H1 OR &H2 THEN _
  193.        IF MULTI.LINK.VERSION > 5000 THEN _
  194.           POKE (MULTI.LINK.COM.PORT),&H0 _
  195.        ELSE POKE (MULTI.LINK.COM.PORT),&H9
  196. '
  197. ' *****************************************************************************
  198. ' *                  MLUTIL ENQ                                               *
  199. ' *****************************************************************************
  200. '
  201.     AX = &H1        ' Tell ML to conditional enque on the comm. port
  202.     GOSUB 70
  203. '
  204. ' *****************************************************************************
  205. ' *                  MLUTIL BAUD 19200                                        *
  206. ' *****************************************************************************
  207. '
  208.     AX = &H600       ' Tell ML to reset the buad rate (19200 BAUD)
  209.     BX = 19200
  210.     GOSUB 80
  211.     RETURN
  212. '
  213. ' *****************************************************************************
  214. ' *                  MLUTIL DEQ                                               *
  215. ' *****************************************************************************
  216. '
  217. 60 AX = &H100        ' Tell ML to unconditionally deque the comm. port
  218. 70 BX = -4
  219.    IF COM.PORT$ = "COM2" THEN _
  220.       BX = -3
  221. '
  222. ' *****************************************************************************
  223. ' *  MULTI-LINK PROGRAMMING SUPPORT INTERFACE                                 *
  224. ' *****************************************************************************
  225. '
  226. 80 CALL RBBSML(AX,BX)
  227.    RETURN
  228.    END SUB
  229. '  $SUBTITLE: 'COPYWRIT - subroutine to display RBBS-PC copyright'
  230. '  $PAGE
  231. '
  232. '  SUBROUTINE NAME    -- COPYWRIT
  233. '
  234. '  INPUT PARAMETERS   --  NONE
  235. '
  236. '  OUTPUT PARAMETERS  --  NONE
  237. '
  238. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC'S COPYRIGHT NOTICE ON THE LOCAL
  239. '                         SYSOP'S SCREEN
  240. '
  241.       SUB COPYWRIT STATIC
  242. 97 WIDTH 80
  243.    CLS
  244.    KEY OFF
  245.    LOCATE ,,0
  246.    PRINT TAB(60)"tm"
  247.    PRINT TAB(16) STRING$(15,205)" U S E R W A R E " STRING$(15,205)
  248.    PRINT
  249.    PRINT TAB(17)"Capital PC User Group User-Supported Software"
  250.    PRINT
  251.    PRINT TAB(5) CHR$(214) STRING$(66,196) CHR$(183)
  252.    FOR I = 1 TO 12
  253.      READ A$
  254.      PRINT TAB(5) CHR$(186);A$; SPACE$(66 - LEN(A$)); CHR$(186)
  255.    NEXT
  256.    PRINT TAB(5) CHR$(211) STRING$(66,196) CHR$(189)
  257.    PRINT TAB(21)"Copyright (c) 1983-87 Tom Mack, 10210 Oxfordshire Road, Great Falls, VA"
  258.    DATA "    If you are using RBBS-PC CPC15.1 and find it valuable, I"
  259.    DATA "    suggest you consider a contribution to"
  260.    DATA ""
  261.    DATA "                 Capital PC Software Exchange"
  262.    DATA "                     Post Office Box 6128"
  263.    DATA "                Silver Spring, Maryland  20906"
  264.    DATA ""
  265.    DATA "    You are free to copy and share RBBS-PC CPC15.1 with"
  266.    DATA "    others on these three conditions:"
  267.    DATA "      1.  This program is not distributed in modified form."
  268.    DATA "      2.  No fee or consideration is charged for RBBS-PC, itself."
  269.    DATA "      3.  This notice is not bypassed or removed."
  270.    CALL DELAYIT (8)
  271.    END SUB
  272. ' $SUBTITLE: 'GETCOMND - subroutine to get command from command line'
  273. ' $PAGE
  274. '
  275. '  SUBROUTINE NAME    -- GETCOMND
  276. '
  277. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  278. '                        CONFIG.FILENAME$     NAME OF RBBS-PC ".DEF" FILE TO
  279. '                                             USE AS A MODEL WHEN CREATING THE
  280. '                                             .DEF FILE NAME TO BE USED BY THIS
  281. '                                             COPY OF RBBS-PC.
  282. '
  283. '                        COMMAND LINE         COMMAND LINE USED TO INVOKE
  284. '                                             RBBS-PC IN THE FORM:
  285. '
  286. '             RBBS-PC.EXE x filename DEBUG /time /baud
  287. '
  288. '   WHERE THE OPTIONAL PARAMETERS ARE:
  289. '
  290. '  x       IS THE NODE ID IN THE RANGE 1-9,0,A-Z
  291. ' filename IS THE FULLY QUALIFIED FILE NAME TO USE AS THE ".DEF" FILE
  292. ' DEBUG    IS A DEBUGGING SWITCH
  293. ' /time    IS THE TIME OF DAY FOR RBBS-PC TO RETURN TO THE CALLER
  294. ' /baud    IS THE BAUD RATE OF THE CALLER IF RBBS-PC IS BEING SHELLED TO BY
  295. '             ANOTHER COMMUNICATIONS PROGRAM (THE COMMUNICATIONS PORT BEING
  296. '             USED IS ASSUMED TO BE THE ONE INPUTTED VIA THE RBBS-PC CONFIG
  297. '             PROGRAM
  298. ' IF NO PARAMETERS ARE SUPPLIED, RBBS-PC ASSUMES THAT THE .DEF FILE NAME IS
  299. ' RBBS-PC.DEF AND THAT THE NODE IS NODE 1.
  300. '  OUTPUT PARAMETERS  -- CONFIG.FILENAME$     NAME OF RBBS-PC ".DEF" FILE FOR
  301. '                                             THIS COPY OF RBBS-PC TO USE
  302. '                        NODE.RECORD.INDEX    RECORD NUMBER WITHIN THE
  303. '                                             MESSAGES FILE FOR THIS "NODE"
  304. '                                             (RANGE IS 2 TO 36)
  305. '
  306. '  SUBROUTINE PURPOSE --  TO GET NODE ID FROM COMMAND LINE
  307. '
  308.       SUB GETCOMND (PASSED.DEBUG,NETIME$,NETBAUD$) STATIC            ' CPC15-1B
  309.       STATIC DEBUG
  310. '
  311. ' *****************************************************************************
  312. ' *  GET NODE ID FROM COMMAND LINE                                            *
  313. ' *****************************************************************************
  314. '
  315.       PM$ = COMMAND$
  316.       CALL ALLCAPS(PM$)
  317.       IF INSTR(PM$,"/") = 0 THEN _                                   ' CPC15-1B
  318.          GOTO 98
  319. '
  320. ' *****************************************************************************
  321. ' * PARSE THE COMMAND LINE FOR TWO POSITIONAL SWITCHES FOR NET MAIL           *
  322. ' *****************************************************************************
  323. '
  324.       CMD.LINE$ = MID$(PM$,INSTR(PM$,"/") + 1,LEN(PM$) - INSTR(PM$,"/")) ' CPC15-1B
  325.       PM$ = LEFT$(PM$,INSTR(PM$,"/") - 1)                            ' CPC15-1B
  326.       IF INSTR(CMD.LINE$,"/") = 0 THEN _                             ' CPC15-1B
  327.          NETIME$ = CMD.LINE$ : _                                     ' CPC15-1B
  328.          NETBAUD$ = ""                                               ' CPC15-1B
  329.       IF INSTR(CMD.LINE$,"/") > 0 THEN _                             ' CPC15-1B
  330.          NETIME$ = LEFT$(CMD.LINE$,INSTR(CMD.LINE$,"/") - 1) : _     ' CPC15-1B
  331.          NETBAUD$ = MID$(CMD.LINE$,INSTR(CMD.LINE$,"/") + 1)         ' CPC15-1B
  332.       CALL TRIM(NETIME$)                                             ' CPC15-1B
  333.       CALL TRIM(NETBAUD$)                                            ' CPC15-1B
  334. 98    A = INSTR(PM$,"DEBUG")
  335.       IF A>0 THEN _
  336.          DEBUG = -1 : _
  337.          PM$ = LEFT$(PM$,A-1) + RIGHT$(PM$,LEN(PM$)-A-4)
  338.       PASSED.DEBUG = DEBUG
  339.       IF LEN(PM$) = 0 THEN _
  340.          PM$ = "-"
  341.       NODE.RECORD.INDEX = INSTR("-1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ",LEFT$(PM$,1))
  342.       IF NODE.RECORD.INDEX < 2 THEN _
  343.          NODE.RECORD.INDEX = 2
  344.       NODE.ID$ = STR$(NODE.RECORD.INDEX-1)
  345.       IF LEN(PM$) > 2 AND MID$(PM$,2,1) = " " THEN _
  346.          CONFIG.FILENAME$ = MID$(PM$,3)_
  347.       ELSE MID$(CONFIG.FILENAME$,5,1) = PM$
  348.       END SUB
  349. ' $SUBTITLE: 'TRIM - subroutine to eliminate leading/trailing blanks'
  350. ' $PAGE
  351. '
  352. '  SUBROUTINE NAME    -- TRIM
  353. '
  354. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  355. '                        TRIM.PARM$           STRING THAT IS TO HAVE LEADING
  356. '                                             AND TRAILING BLANKS ELIMINATED  
  357. '                                             FROM
  358. '  OUTPUT PARAMETERS  -- TRIM.PARM$           STRING WITH NO LEADING OR TRAIL-
  359. '                                             ING BLANKS
  360. '
  361. '  SUBROUTINE PURPOSE --  TO STRIP LEADING AND TRAILING BLANKS
  362. '
  363.       SUB TRIM (TRIM.PARM$) STATIC                                   ' CPC15-1B
  364. 99    L = INSTR(TRIM.PARMS$," ")                                     ' CPC15-1B
  365.       IF L < 1 THEN _                                                ' CPC15-1B
  366.          EXIT SUB                                                    ' CPC15-1B
  367.       IF L = 1 THEN _                                                ' CPC15-1B
  368.          WHILE LEFT$(TRIM.PARM$,1) = " " : _                         ' CPC15-1B
  369.             TRIM.PARM$ = RIGHT$(TRIM.PARM$,LEN(TRIM.PARM$)-1) : _    ' CPC15-1B
  370.          WEND                                                        ' CPC15-1B
  371.       WHILE RIGHT$(TRIM.PARM$,1) = " "                               ' CPC15-1B
  372.         TRIM.PARM$ = LEFT$(TRIM.PARM$,LEN(TRIM.PARM$)-1)             ' CPC15-1B
  373.       WEND                                                           ' CPC15-1B
  374.       END SUB                                                        ' CPC15-1B
  375. '
  376. '  $SUBTITLE: 'SYSMENU - subroutine to display RBBS-PC SYSOP menu'
  377. '  $PAGE
  378. '
  379. '  SUBROUTINE NAME    --  SYSMENU
  380. '
  381. '  INPUT PARAMETERS   --  PARAMETER           MEANING
  382. '                           DELAY!    TIME IN SECONDS AFTER MIDNIGHT TO WAIT
  383. '                                     BEFORE DISPLAYING
  384. '
  385. '  OUTPUT PARAMETERS  --  NONE
  386. '
  387. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC's SYSOP MENU ON THE LOCAL SCREEN
  388. '
  389.     SUB SYSMENU STATIC
  390.     DELAY! = 0
  391. 112 LOCAL.USER = TRUE
  392.     SNOOP = TRUE
  393.     PAGE.LENGTH.HOLD = PAGE.LENGTH
  394.     PAGE.LENGTH = 0
  395.     SUBROUTINE.PARAMETER = 1
  396.     WHILE SUBROUTINE.PARAMETER = 1
  397.       CALL CHECKTIM (DELAY!)
  398.     WEND
  399.     CLS
  400.     BYPASS.TIME.CHECK = TRUE
  401.     SECONDS.PER.SESSION! = 4
  402.     CALL BUFFILE ("MENU0")
  403.     BYPASS.TIME.CHECK = FALSE
  404.     LOCAL.USER = FALSE
  405.     PAGE.LENGTH = PAGE.LENGTH.HOLD
  406.     IF NOT OK THEN _
  407.        PRINT "MENU0 not on default drive"
  408.     LOCATE 2,18
  409.     PRINT LEFT$(VERSION.ID$,8);
  410.     LOCATE 2,58
  411.     X$ = DATE$
  412.     PRINT LEFT$(X$,6)+RIGHT$(X$,2);
  413.     LOCATE 2,72
  414.     PRINT LEFT$(TIME$,5);
  415.     IF DEBUG THEN _
  416.        LOCATE 16,1 : _
  417.        PRINT "DEBUG Active";
  418.     LOCATE 18,23
  419.     PRINT NODE.ID$;
  420.     LOCATE 18,74
  421.     PRINT MID$(STR$(FRE("A")),2)
  422.     IF COLOR.SUPPORT THEN _
  423.        LOCATE 20,23 : _
  424.        PRINT "YES";
  425.     IF RESTRICT.BAUD THEN _
  426.        LOCATE 20,51 : _
  427.        PRINT "NO ";
  428.     IF EXTENDED.LOGGING THEN _
  429.        LOCATE 20,75 : _
  430.        PRINT "YES";
  431.     IF FMS.DIRECTORY$ <> "" THEN _
  432.        LOCATE 22,75 : _
  433.        PRINT "YES";
  434.     END SUB
  435. ' $SUBTITLE: 'BADCHAR - subroutine to check user names for bad characters'
  436. ' $PAGE
  437. '
  438. '  SUBROUTINE NAME    -- BADCHAR
  439. '
  440. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  441. '                           PASSED.NAME$           USER NAME
  442. '
  443. '  OUTPUT PARAMETERS  --    PASSED.NAME$           USER NAME WILL CONTAIN ""
  444. '                                                  IF BAD CHARACTERS FOUND
  445. '
  446. '  SUBROUTINE PURPOSE -- TO CHECK USER NAMES FOR INVALID CHARACTERS
  447. '
  448.     SUB BADCHAR (PASSED.NAME$) STATIC
  449. '
  450.     J = 1
  451.     XX = LEN(PASSED.NAME$)
  452. 457 IF J > XX THEN _
  453.        EXIT SUB
  454.     X = ASC(MID$(PASSED.NAME$,J,1))
  455.     IF (X < 65 OR X > 90) AND _
  456.        (X <> 32 AND X <> 39 AND X <> 45 AND X <> 46) THEN _
  457.        PASSED.NAME$ = "" : _
  458.        EXIT SUB
  459.     J = J + 1
  460.     GOTO 457
  461.     END SUB
  462. ' $SUBTITLE: 'LINE25 - subroutine to build/display RBBS-PCs line 25'
  463. ' $PAGE
  464. '
  465. '  SUBROUTINE NAME    -- LINE25
  466. '
  467. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  468. '                        SUBROUTINE.PARAMETER = 1  BUILD DISPLAY FOR LINE 25
  469. '                        SUBROUTINE.PARAMETER = 2  UPDATE LINE 25
  470. '                        LOCK.STATUS$              STATUS OF LOCKS IN A MULTI-
  471. '                                                  USER ENVIRONMENT OR TIME OF
  472. '                                                  DAY USER LOGGED ON OR THE
  473. '                                                  RE-CYCLED
  474. '
  475. '  OUTPUT PARAMETERS  -- CURSOR.LINE               CURRENT LINE ON SCREEN
  476. '                        CURSOR.ROW                CURRENT ROW ON CURSOR.LINE
  477. '
  478. '  SUBROUTINE PURPOSE -- TO BUILD OR UPDATE RBBS-PC'S LINE 25 DISPLAYED
  479. '                        ON THE PC SCREEN THAT IS RUNNING RBBS-PC.
  480. '
  481.       SUB LINE25 STATIC
  482.       ON SUBROUTINE.PARAMETER GOTO 949,950
  483. '
  484. ' *****************************************************************************
  485. ' *  BUILD LINE 25 DISPLAY                                                    *
  486. ' *****************************************************************************
  487. '
  488. 949 LINE.25$ = MID$("    AVL ",1-4*SYSOP.AVAILABLE,4) + _
  489.                MID$("    ANY ",1-4*SYSOP.ANNOY,4) + _
  490.                MID$("    LPT ",1-4*PRINTER,4) + _
  491.                MID$("SYS",1,-3*SYSOP.NEXT)
  492. '
  493. ' *****************************************************************************
  494. ' *  LINE 25 UPDATE ROUTINE                                                   *
  495. ' *****************************************************************************
  496. '
  497. 950 IF NOT SNOOP THEN _
  498.        EXIT SUB
  499.     CURSOR.LINE = CSRLIN
  500.     CURSOR.ROW = POS(0)
  501.     HH = LEN(ACTIVE.USER.NAME$) + LEN(CI$) + LEN(LINE.25$) + 18
  502.     IF AUTODOWNLOAD.AVAILABLE THEN _
  503.        HH = HH + 4
  504.     LOCATE 25,1
  505.     IF NETWORK.TYPE = 0 THEN _
  506.        IF AUTODOWNLOAD.AVAILABLE THEN _
  507.           LOCK.STATUS$ = SPACE$(3) + _
  508.                          "AD  " + _
  509.                          TIME.LOGGED.ON$ _
  510.        ELSE LOCK.STATUS$ = SPACE$(3)+TIME.LOGGED.ON$
  511.     IF HH>79 THEN _
  512.        HH=78
  513.     PRINT LINE.25$+SPACE$(79-HH)+STR$(USER.SECURITY.LEVEL)+" "+ACTIVE.USER.NAME$+" "+CI$+" "+LOCK.STATUS$;
  514.     LOCATE CURSOR.LINE,CURSOR.ROW
  515.     END SUB
  516. ' $SUBTITLE: 'SRCHCMND    - subroutine to search command list'
  517. ' $PAGE
  518. '
  519. '  SUBROUTINE NAME    -- SRCHCMND
  520. '
  521. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  522. '                        STRT.POS      POSITION TO BEGIN SEARCH AT
  523. '                        ALL.OPTS$     STRING TO SEARCH (COMMAND LIST)
  524. '                        Z$            WHAT TO LOOK FOR
  525. '
  526. '  OUTPUT PARAMETERS  -- WHERE.FOUND   POSITION OF Z$ IN ALL.OPTS$
  527. '                                      0 IF NOT FOUND
  528. '
  529. '  SUBROUTINE PURPOSE -- SEARCHES VALID COMMAND LIST FOR THE REQUESTED
  530. '                        COMMAND.  IF THE SYSOP HAS CONFIGURED RBBS-PC TO
  531. '                        RESTRICT COMMANDS TO ONLY THOSE VALID WITHIN THE
  532. '                        RBBS-PC SUBSYSTEM, THEN ONLY THOSE COMMANDS AND
  533. '                        "GLOBAL" COMMANDS ARE VALID.  OTHERWISE ALL COMMANDS
  534. '                        ARE VALID FROM ANY OF THE RBBS-PC SUBSYSTEMS.
  535. '
  536.      SUB SRCHCMND (STRT.POS,WHERE.FOUND) STATIC
  537. 1240 WHERE.FOUND = INSTR(STRT.POS,ALL.OPTS$,Z$)
  538.      IF WHERE.FOUND = 0 THEN _  'Not found: decide whether to hunt further
  539.         IF STRT.POS < 2 OR RESTRICT.VALID.CMDS THEN _
  540.            EXIT SUB _  ' fully searched or restricted
  541.         ELSE _
  542.            WHERE.FOUND = INSTR(1,ALL.OPTS$,Z$) : _ 'hunt further
  543.            EXIT SUB
  544.      IF NOT RESTRICT.VALID.CMDS THEN _
  545.         EXIT SUB             ' everything found valid
  546. '
  547. ' *****************************************************************************
  548. ' * RESTRICT COMMANDS TO SUBSYSTEMS (EXCEPT GLOBAL AND SYSOP)                 *
  549. ' *****************************************************************************
  550. '
  551.      IF WHERE.FOUND > LEN(ALL.OPTS$)-11 THEN _
  552.         EXIT SUB                          ' ACCEPT GLOBAL & SYSOP
  553.      IF MID$(ALL.OPTS$,WHERE.FOUND,1) = "G" THEN _
  554.         EXIT SUB                          ' ACCEPT GOODBYE/GRAPHICS
  555.      IF (STRT.POS < BEG.FILE AND WHERE.FOUND >= BEG.FILE ) OR _
  556.         (STRT.POS < BEG.UTIL AND WHERE.FOUND >= BEG.UTIL ) THEN _
  557.           WHERE.FOUND = 0                 ' REJECT: NOT IN SECTION
  558.      END SUB
  559. ' $SUBTITLE: 'HELP    - Processes requests for help'
  560. ' $PAGE
  561. '
  562. '  SUBROUTINE NAME    -- HELP
  563. '
  564. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  565. '                       SECTION             ORDER OF 1ST COMMAND IN CURRENT
  566. '                                              SECTION
  567. '                       GRAPHICS.DEFAULT    WHAT GRAPHICS TYPE USER WANTS
  568. '                       HELP.DEFAULT$       HELP GET IF PRESS ENTER
  569. '                       HELP.PATH$
  570. '                       HELP.EXTENSION$
  571. '                       BEG.FILE
  572. '                       BEG.MAIN
  573. '                       BEG.UTIL
  574. '
  575. '  OUTPUT PARAMETERS  -- DISPLAYS HELP
  576. '
  577. '  SUBROUTINE PURPOSE -- THE MAIN HELP PROCESSOR FOR RBBS.  PUTS UP THE
  578. '                        OPTIONAL MENU.  ACCEPTS HELP WITH INDIVIDUAL
  579.      SUB HELP (SECTION,GRAPHIC.DEFAULT$,HELP.DEFAULT$) STATIC
  580. 1330 HELP.MENU$ = HELP.PATH$+"HELP"+HELP.EXTENSION$
  581.      GOT.MENU = TRUE
  582.      IF Q>1 THEN _
  583.         ANS.INDEX = 2 : _
  584.         LAST.INDEX = Q: _
  585.         GOTO 1332
  586. 1331 IF GOT.MENU THEN _
  587.         FILE.NAME$ = HELP.MENU$ : _
  588.         GOSUB 1350 : _
  589.         GOT.MENU = OK
  590.      ANS.INDEX = 1
  591.      A$ = "HELP with (LETTER/SECTION/TOPIC, [ENTER]="+HELP.DEFAULT$+", [QH]=quit HELP)"
  592.      SUBROUTINE.PARAMETER = 1
  593.      CALL TGET
  594.      IF SUBROUTINE.PARAMETER = -1 THEN _
  595.         EXIT SUB
  596.      IF Q = 0 THEN _
  597.         Q = 1:_
  598.         B$(1) = HELP.DEFAULT$
  599.      LAST.INDEX = Q
  600. 1332 Z$ = B$(ANS.INDEX)
  601.      CALL ALLCAPS (Z$)
  602.      IF Z$="QH" THEN _
  603.         EXIT SUB
  604.      IF Z$ = "?" THEN _
  605.         Z$ = "H"
  606.      CALL BADFILE (Z$,BAD.FILE.NAME.INDEX)
  607.      ON BAD.FILE.NAME.INDEX GOTO 1333,1340,1340
  608. 1333 IF LEN(Z$) = 1 THEN _
  609.         CALL SRCHCMND (SECTION,FF) : _
  610.         IF FF<1 THEN _
  611.            OK = FALSE :_
  612.            GOTO 1334 _
  613.         ELSE X = -(FF>=BEG.MAIN)-(FF>=BEG.FILE)-(FF>=BEG.UTIL):_
  614.              Z$ = MID$("MFU",X,1) + Z$
  615.      FILE.NAME$ = HELP.PATH$ + Z$ + HELP.EXTENSION$
  616.      GOSUB 1350
  617. 1334 IF NOT OK THEN _
  618.         A$ = "No help for "+Z$ :_
  619.         CALL QTPUT (A$,1) : _
  620.         CALL UPDTCALR (A$,2)
  621.      ANS.INDEX = ANS.INDEX + 1
  622.      IF ANS.INDEX <= LAST.INDEX THEN _
  623.         GOTO 1332
  624.      GOTO 1331
  625. 1340 OK = FALSE
  626.      GOTO 1334
  627. 1350 CALL GRAPHIC (GRAPHIC.DEFAULT$)
  628.      CALL BUFFILE (FILE.NAME$)
  629.      RETURN
  630.      END SUB
  631. ' $SUBTITLE: 'QTPUT    - subroutine to quickly write to terminal'
  632. ' $PAGE
  633. '
  634. '  SUBROUTINE NAME    -- QTPUT
  635. '
  636. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  637. '                        STRNG$        STRING TO WRITE OUT
  638. '                        NUM.RETURNS   NUMBER OF CARRIAGE RETURNS
  639. '
  640. '  OUTPUT PARAMETERS  -- NONE
  641. '
  642. '  SUBROUTINE PURPOSE -- SUBROUTINE TO QUICKLY WRITE TO THE TERMINAL.  THIS IS
  643. '                        IS DIFFERENT FROM "TPUT" IN THE THINGS IT DOESN'T DO:
  644. '                                A.) NO FUNCTION KEY CHECK,
  645. '                                B.) NO CONVERSION TO UPPER CASE,
  646. '                                C.) NO STRING RE-INITILIZATION OF "STRNG$",
  647. '                                D.) NO CHECK FOR CARRIER PRESENT, AND
  648. '                                E.) NO CHECK FOR IMBEDDED CARRIAGE RETURN IN
  649. '                                       "STRNG$".
  650. '                                F.) NO SUPPORT FOR XON/XOFF
  651. '
  652.       SUB QTPUT (STRNG$,NUM.RETURNS) STATIC
  653.       IF UPPER.CASE THEN _
  654.          GOTO 1476
  655.       IF COLOR.SUPPORT THEN _
  656.          IF SNOOP THEN _
  657.             GOTO 1476
  658.       IF NOT LOCAL.USER THEN _
  659.          PRINT #3,STRNG$;
  660.       IF SNOOP THEN _
  661.          PRINT STRNG$;
  662.       CALL SKIPLINE (NUM.RETURNS)
  663.       GOTO 1477
  664. 1476  A$ = STRNG$
  665.       SUBROUTINE.PARAMETER = 4
  666.       CALL TPUT
  667.       CALL SKIPLINE (NUM.RETURNS)
  668. 1477  END SUB
  669. ' $SUBTITLE: 'PRTCRLF  - subroutine to write snoop lines'
  670. ' $PAGE
  671. '
  672. '  SUBROUTINE NAME    -- PRTCRLF
  673. '
  674. '  INPUT PARAMETERS   -- PARAMETER          MEANING
  675. '                         STRNG$             STRING TO WRITE TO SCREEN
  676. '
  677. '  OUTPUT PARAMETERS  -- NONE
  678. '
  679. '  SUBROUTINE PURPOSE -- TO WRITE OUT LINES TO THE LOCAL SYSOP'S SCREEN THAT
  680. '                        MAY HAVE INTERNAL CARRIAGE RETURN AND LINE FEEDS
  681. '                        IMBEDDED IN IT.
  682. '
  683.      SUB PRTCRLF (STRNG$) STATIC
  684. 1478 CURSOR.ROW = 1
  685.      L = LEN(STRNG$)
  686.      NUM.RETURNS = 0
  687.      WHILE CURSOR.ROW <= L
  688.        CURSOR.LINE = CURSOR.ROW + _
  689.                      INSTR(MID$(STRNG$,CURSOR.ROW) + _
  690.                      CARRIAGE.RETURN$,CARRIAGE.RETURN$) - 2
  691.        S1 = -(CURSOR.LINE < L)
  692.        PRINT MID$(STRNG$,CURSOR.ROW,CURSOR.LINE-CURSOR.ROW + 1); _
  693.              MID$(LINE.FEED$,1,S1);
  694.        CURSOR.ROW = CURSOR.LINE + LEN(RETURN.LINE.FEED$) + 1
  695.        NUM.RETURNS = NUM.RETURNS + S1
  696.      WEND
  697.      END SUB
  698. ' $SUBTITLE: 'SKIPLINE - subroutine to write a blank line to user'
  699. ' $PAGE
  700. '
  701. '  SUBROUTINE NAME    -- SKIPLINE
  702. '
  703. '  INPUT PARAMETERS   --   PARAMETER             MEANING
  704. '                        LOCAL.USER
  705. '                        MODEM.STATUS.REGISTER
  706. '                        NUM.RETURNS
  707. '                        RETURN.LINE.FEED$
  708. '                        SNOOP
  709. '
  710. '  OUTPUT PARAMETERS  -- NONE
  711. '
  712. '  SUBROUTINE PURPOSE -- SKIP A LINE ON THE USER'S TERMINAL
  713. '
  714.       SUB SKIPLINE (NUM.RETURNS) STATIC
  715. 1485  IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  716.          FOR I=1 TO NUM.RETURNS:PRINT #3,RETURN.LINE.FEED$;:NEXT
  717.       IF SNOOP THEN _
  718.          FOR I=1 TO NUM.RETURNS:PRINT:NEXT
  719.       LINES.PRINTED = LINES.PRINTED + NUM.RETURNS
  720.       END SUB
  721. ' $SUBTITLE: 'SETCRLF -- subroutine to set up nulls/lf's for output'
  722. ' $PAGE
  723. '
  724. '  SUBROUTINE NAME    -- SETCRLF
  725. '
  726. '  INPUT PARAMETERS   --   PARAMETER          MEANING
  727. '                        CARRIAGE.RETURN$    CARRIAGE RETURN CHARACTER
  728. '                        CI$                 CITY/STATE OF CALLER
  729. '                        LINE.FEED$          LINE FEED CHARACTER
  730. '                        LINE.FEEDS          LINE FEED SWITCH
  731. '                        NUL$                NULL CHARACTER
  732. '
  733. '  OUTPUT PARAMETERS  -- RETURN.LINE.FEED$   END-OF-LINE STRING
  734. '
  735. '  SUBROUTINE PURPOSE -- SET UP THE NECESSARCY NULLS/LINE FEEDS TO END
  736. '                        EACH OUTPUT TO THE COMMUNICATIONS PORT WITH
  737. '
  738.       SUB SETCRLF STATIC
  739. 1496  RETURN.LINE.FEED$ = MID$(CARRIAGE.RETURN$,1,-(NOT LOCAL.USER)) + _
  740.                           NUL$ + _
  741.                           MID$(LINE.FEED$,1,-(LINE.FEEDS <> 0))
  742.       END SUB
  743. ' $SUBTITLE: 'SETBAUD - subroutine to set the baud rate in the RS232'
  744. ' $PAGE
  745. '
  746. '  SUBROUTINE NAME    -- SETBAUD
  747. '
  748. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  749. '                         BAUD.RATE.DIVISOR   NUMBER TO DIVIDE THE 8250 CHIP'S
  750. '                                             PROGRAMABLE CLOCK TO ADJUST THE
  751. '                                             BAUD RATE TO THE USER'S BAUD
  752. '                                             RATE (INDEPENDENT OF THE BAUD
  753. '                                             RATE USED TO OPEN THE COMM. PORT)
  754. '
  755. '        DESIRED BAUD        DIVISIOR (DECIMAL) TO OBTAIN DESIRED BAUD RATE
  756. '            RATE              PCjr         PC AND XT
  757. '              50             2237             2304
  758. '              75             1491             1536
  759. '             110             1017             1047
  760. '             134.5            832              857
  761. '             150              746              768
  762. '             300              373              384
  763. '             600              186              192
  764. '            1200               93               96
  765. '            1800               62               64
  766. '            2000               56               58
  767. '            2400               47               48
  768. '            3600               31               32
  769. '            4800               23               24
  770. '            7200          not available         16
  771. '            9600          not available         12
  772. '
  773. '  OUTPUT PARAMETERS  -- BAUD RATE SET IN THE RS232 INTERFACE
  774. '
  775. '  SUBROUTINE PURPOSE -- TO SET THE BAUD RATE IN THE RS232 INTERFACE
  776. '                        INDEPENDENT OF THE BAUD RATE THE COMMUNICATIONS PORT
  777. '                        WAS OPENED AT
  778. '
  779.       SUB SETBAUD STATIC
  780. '
  781. ' *****************************************************************************
  782. ' *  BAUD RATE CHANGE ROUTINE                                                 *
  783. ' *****************************************************************************
  784. '
  785. 1654 LINE.CONTROL.STATUS = INP(LINE.CONTROL.REGISTER)
  786.      MSB.SAVE = INP(MSB)
  787.      OUT MSB,0
  788.      OUT LINE.CONTROL.REGISTER,LINE.CONTROL.STATUS OR 128
  789.      MOST.SIGNIFICANT.BYTE = FIX (BAUD.RATE.DIVISOR / 256)
  790.      LEAST.SIGNIFICANT.BYTE = BAUD.RATE.DIVISOR - (MOST.SIGNIFICANT.BYTE * 256)
  791.      OUT LSB,LEAST.SIGNIFICANT.BYTE
  792.      OUT MSB,MOST.SIGNIFICANT.BYTE
  793.      OUT LINE.CONTROL.REGISTER,LINE.CONTROL.STATUS
  794.      OUT MSB,MSB.SAVE
  795.      END SUB
  796. ' $SUBTITLE: 'KILLMSG - subroutine to delete messages'
  797. ' $PAGE
  798. '
  799. '  SUBROUTINE NAME    -- KILLMSG
  800. '
  801. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  802. '                         MESSAGE.TO.KILL              MESSAGE NUMBER TO KILL
  803. '                         ACTIVE.MESSAGES              NUMBER ACTIVE MESSAGES
  804. '
  805. '  OUTPUT PARAMETERS  --  NONE
  806. '
  807. '  SUBROUTINE PURPOSE --  TO KILL/DELETE OLD OR UNNECESSARY MESSAGES
  808. '
  809.      SUB KILLMSG (MESSAGE.TO.KILL,ACTIVE.MESSAGES) STATIC
  810. '
  811.      FIELD #1,128 AS MESSAGE.RECORD$
  812.      QX = 1
  813. 3955 IF QX > ACTIVE.MESSAGES THEN _
  814.         A$ = "No such msg #" + STR$(MESSAGE.TO.KILL) : _
  815.         GOTO 4031
  816.      IF M(QX,2) = MESSAGE.TO.KILL AND MESSAGE.TO.KILL >= 1 THEN _
  817.         GOTO 3970
  818.      QX = QX + 1
  819.      GOTO 3955
  820. 3970 SUBROUTINE.PARAMETER = 3
  821.      CALL FILELOCK
  822.      GET 1,M(QX,1)
  823.      IF SYSOP THEN _
  824.         GOTO 4030
  825. 3980 Z$ = MID$(MESSAGE.RECORD$,101,15)
  826.      Z$ = LEFT$(Z$ + SPACE$(2),INSTR(Z$ +SPACE$(2),SPACE$(2))-1)
  827.      IF LEN(Z$) = 0 THEN _
  828.         GOTO 4030
  829. 3990 IF Z$ = "^READ^" OR Z$ = "^KILL^" THEN _
  830.         IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  831.            GOTO 4030 _
  832.         ELSE MESSAGE.PASSWORD = TRUE : _
  833.              ATTEMPTS.ALLOWED = 0 : _
  834.              CALL QTPUT("Only sender & receiver can kill",1): _
  835.              GOTO 4031
  836. 4000 IF LEFT$(Z$,1) = "!" THEN _
  837.         Z$ = MID$(Z$,2)
  838. 4010 PASSWORD.SAVE$ = Z$ + SPACE$(15-LEN(Z$))
  839.      ATTEMPTS.ALLOWED = 1
  840.      MESSAGE.PASSWORD = TRUE
  841.      CALL PASSWORD
  842.      IF PASSWORD.FAILED THEN _
  843.         GOTO 4031
  844. 4030 LSET MESSAGE.RECORD$ = LEFT$(MESSAGE.RECORD$,115) + _
  845.                             DELETED.MESSAGE$ + _
  846.                             MID$(MESSAGE.RECORD$,117)
  847.      PUT 1,LOC(1)
  848.      A$ = "Killed Msg # " + STR$(MESSAGE.TO.KILL)
  849.      SUBROUTINE.PARAMETER = 4
  850.      CALL FILELOCK
  851.      SUBROUTINE.PARAMETER = 5
  852.      CALL TPUT
  853.      EXIT SUB
  854. 4031 SUBROUTINE.PARAMETER = 4
  855.      CALL TPUT
  856.     END SUB
  857. ' $SUBTITLE: 'GETIME - subroutine to calculate elapsed time'
  858. ' $PAGE
  859. '
  860. '  SUBROUTINE NAME    -- GETIME
  861. '
  862. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  863. '                         TIME.LOGGED.ON$
  864. '
  865. '  OUTPUT PARAMETERS  --  HH                     NUMBER OF HOURS ON
  866. '                         MM                     NUMBER OF MINUTES ON
  867. '                         SS                     NUMBER OF SECONDS ON
  868. '
  869. '  SUBROUTINE PURPOSE --  CALCULATE THE ELASPED TIME A USER HAS BEEN ON
  870. '
  871.      SUB GETIME STATIC
  872. 9140 H = VAL(MID$(TIME.LOGGED.ON$,1,2))
  873.      M = VAL(MID$(TIME.LOGGED.ON$,4,2))
  874.      S = VAL(MID$(TIME.LOGGED.ON$,7,2))
  875.      X$ = TIME$
  876.      HH = VAL(MID$(X$,1,2))
  877.      MM = VAL(MID$(X$,4,2))
  878.      JJ = VAL(MID$(X$,7,2))
  879.      IF S <= JJ THEN _
  880.         SSS = JJ-S _
  881.      ELSE SSS = 60-(S-JJ) : _
  882.           M = M + 1
  883. 9150 IF M <= MM THEN _
  884.         MMM = MM-M _
  885.      ELSE MMM = 60-(M-MM) : _
  886.           H = H + 1
  887. 9160 IF H <= HH THEN _
  888.         HHH = HH-H : _
  889.         GOTO 9161 _
  890.      ELSE HHH = 24-(H-HH)
  891. 9161 END SUB
  892. ' $SUBTITLE: 'DEFAULTU - subroutine to update user defauts'
  893. ' $PAGE
  894. '
  895. '  SUBROUTINE NAME    -- DEFAULTU
  896. '
  897. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  898. '                         AUTODOWNLOAD.DESIRED  
  899. '                         CHECK.BULLETIN.LOGON
  900. '                         EXPERT.USER
  901. '                         GR
  902. '                         LAST.MESSAGE.READ
  903. '                         LINE.FEEDS
  904. '                         NULLS
  905. '                         PAGE.LENGTH
  906. '                         PROMPT.BELL
  907. '                         REG.DATE$
  908. '                         REQ.QUES.ANSWERED
  909. '                         RIGHT.MARGIN
  910. '                         SKIP.FILES.LOGON
  911. '                         TIMES.LOGGED.ON
  912. '                         UPPER.CASE
  913. '                         USER.OPTIONS$
  914. '                         USER.TRANSFER.DEFAULT$
  915. '
  916. '  OUTPUT PARAMETERS  --  USER.OPTONS$
  917. '
  918. '  SUBROUTINE PURPOSE --  TO UPDATE THE USER'S RECORD WITH THEIR OPTIONS
  919. '
  920.      SUB DEFAULTU STATIC
  921. '
  922. ' *****************************************************************************
  923. ' * UPDATE USER DEFAULTS                                                      *
  924. ' *****************************************************************************
  925. '
  926. 9600 LSET USER.OPTIONS$ = _
  927.         MKI$(TIMES.LOGGED.ON) + _
  928.         MKI$(LAST.MESSAGE.READ) + _
  929.         USER.TRANSFER.DEFAULT$ + _
  930.         MID$(STR$(GR),2,1) + _
  931.         MKI$(RIGHT.MARGIN) + _
  932.         MKI$(-PROMPT.BELL-2*EXPERT.USER-4*NULLS-8*UPPER.CASE-16*LINE.FEEDS_
  933.              -32*CHECK.BULLETIN.LOGON - 64*SKIP.FILES.LOGON_
  934.              -128*AUTODOWNLOAD.DESIRED - 256*REQ.QUES.ANSWERED) + _  ' CPC15-1B
  935.         REG.DATE$ + _
  936.         CHR$(PAGE.LENGTH) + _
  937.         STRING$(1,0)
  938.      END SUB
  939. ' $SUBTITLE: 'RECOVMSG - subroutine to recover deleted messages'
  940. ' $PAGE
  941. '
  942. '  SUBROUTINE NAME    -- RECOVMSG
  943. '
  944. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  945. '                         MESSAGE.TO.RECOVER          MESSAGE NUMBER TO RECOVER
  946. '                         FIRST.MESSAGE.RECORD        RECORD # FOR FIRST MSG
  947. '
  948. '  OUTPUT PARAMETERS  --  ACTION.FLAG                 SET TO 0 IF ERROR
  949. '                                                     SET TO -1 IF NO ERROR
  950. '
  951. '  SUBROUTINE PURPOSE --  TO RECOVER DELETED MESSAGES.  NOTE THAT THIS IS ONLY
  952. '                         POSSIBLE IF YOU HAVE NOT COMPRESSED YOUR MESSAGE FILE
  953. '                         USING CONFIG.
  954.      SUB RECOVMSG (MESSAGE.TO.RECOVER,FIRST.MESSAGE.RECORD,ACTION.FLAG) STATIC
  955.       FIELD #1,128 AS MESSAGE.RECORD$
  956. 10410 MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  957.       SUBROUTINE.PARAMETER = 5
  958.       CALL TPUT
  959. 10420 GET 1,MESSAGE.RECORD
  960.       NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,117,4))
  961.       IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  962.          A$ = "USE CONFIG TO REPAIR YOUR MESSAGE FILE" : _
  963.          SUBROUTINE.PARAMETER = 5 : _
  964.          GOTO 10485
  965.       IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  966.          A$ = "No Msg #" + STR$(MESSAGE.TO.RECOVER) : _
  967.          GOTO 10485
  968. 10440 IF VAL(MID$(MESSAGE.RECORD$,2,4)) <> MESSAGE.TO.RECOVER THEN _
  969.          MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE : _
  970.          GOTO 10420
  971. 10450 IF INSTR(MESSAGE.RECORD$,DELETED.MESSAGE$) <> 0 THEN _
  972.          SUBROUTINE.PARAMETER = 3 : _
  973.          CALL TPUT : _
  974.          LSET MESSAGE.RECORD$ = LEFT$(MESSAGE.RECORD$,115) + _
  975.                                 ACTIVE.MESSAGE$ + _
  976.                                 MID$(MESSAGE.RECORD$,117) : _
  977.          PUT 1,LOC(1) : _
  978.          SUBROUTINE.PARAMETER = 4 : _
  979.          CALL TPUT : _
  980.          A$ = "Restored Msg #" + STR$(MESSAGE.TO.RECOVER) : _
  981.          ACTION.FLAG = TRUE : _
  982.          GOTO 10485
  983. 10480 A$ = "Msg #" + STR$(MESSAGE.TO.RECOVER) + " not Dead"
  984. 10485 SUBROUTINE.PARAMETER = 5
  985.       CALL TPUT
  986.       END SUB
  987. ' $SUBTITLE: 'UPDATEU -- Update the users record at logoff'
  988. ' $PAGE
  989. '  SUBROUTINE NAME    -- UPDATEU
  990. '
  991. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  992. '                        ADJUSTED.SECURITY
  993. '                        CURRENT.DATE$
  994. '                        DOWNLOADS
  995. '                        ELAPSED.TIME
  996. '                        LIST.DIRECTORY
  997. '                        MAIN.USER.FILE.INDEX
  998. '                        SECONDS.PER.SESSION!
  999. '                        UPLOADS
  1000. '                        USER.SECURITY.LEVEL
  1001. '
  1002. '  OUTPUT PARAMETERS  -- ELAPSED.TIME$
  1003. '                        LIST.NEW.DATE$
  1004. '                        SECURITY.LEVEL$
  1005. '                        USER.DOWNLOADS$
  1006. '                        USER.UPLOADS$
  1007. '
  1008. '  SUBROUTINE PURPOSE -- UPDATE THE USER RECORD FOR THE USER WHEN THE USER
  1009. '                        EXITS RBBS-PC.
  1010. '
  1011.       SUB UPDATEU STATIC
  1012. 10600 USER.FILE.INDEX = MAIN.USER.FILE.INDEX
  1013.       SUBROUTINE.PARAMETER = 6
  1014.       CALL FILELOCK
  1015.       CALL OPENUSER
  1016.       FIELD 5,31 AS USER.NAME$, _
  1017.               15 AS PASSWORD$, _
  1018.                2 AS SECURITY.LEVEL$, _
  1019.               14 AS USER.OPTIONS$,  _
  1020.               24 AS CITY.STATE$, _
  1021.               19 AS MACHINE.TYPE$, _
  1022.               14 AS LAST.DATE.TIME.ON$, _
  1023.                3 AS LIST.NEW.DATE$, _
  1024.                2 AS USER.DOWNLOADS$, _
  1025.                2 AS USER.UPLOADS$, _
  1026.                2 AS ELAPSED.TIME$
  1027. 10604 GET 5,USER.FILE.INDEX
  1028.       CALL DEFAULTU
  1029.       IF LIST.DIRECTORY THEN _
  1030.          LSET LIST.NEW.DATE$ = CHR$(VAL(MID$(CURRENT.DATE$,7,2)))+_
  1031.                                CHR$(VAL(MID$(CURRENT.DATE$,1,2)))+_
  1032.                                CHR$(VAL(MID$(CURRENT.DATE$,4,2)))
  1033. 10605 LSET USER.DOWNLOADS$ = MKI$(DOWNLOADS)
  1034.       LSET USER.UPLOADS$ = MKI$(UPLOADS)
  1035.       CALL TIMEREMAIN (TIME.REMAINING!)
  1036.       LSET ELAPSED.TIME$ = MKI$(ELAPSED.TIME + _
  1037.                          (SECONDS.PER.SESSION! / 60) - _
  1038.                           TIME.REMAINING!)
  1039.       IF ADJUSTED.SECURITY THEN _
  1040.          LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  1041.       PUT 5,USER.FILE.INDEX
  1042.       END SUB
  1043. ' $SUBTITLE: 'DOSEXIT -- Setup to exit to DOS for SYSOP'
  1044. ' $PAGE
  1045. '  SUBROUTINE NAME    -- DOSEXIT
  1046. '
  1047. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1048. '                        COM.PORT$
  1049. '                        DOORS.TERMINAL.TYPE
  1050. '                        MULTI.LINK.PRESENT
  1051. '                        RBBS.BAT$
  1052. '                        REDIRECT.IO.METHOD
  1053. '
  1054. '  OUTPUT PARAMETERS  -- Q                    NUMBER OF LINES TO WRITE OUT TO
  1055. '                                             RCTTY.BAT$
  1056. '                        B$()                 LINES TO WRITE OUT TO RCTTY.BAT$
  1057. '
  1058. '  SUBROUTINE PURPOSE -- SET UP B$() AND Q IN ORDER TO CALL "RBBSEXIT" AND
  1059. '                        EXIT TO DOS FOR THE REMOTE RBBS-PC SYSOP
  1060. '
  1061.       SUB DOSEXIT STATIC
  1062. 10934 IF MULTI.LINK.PRESENT AND _
  1063.          DOORS.TERMINAL.TYPE > 0 THEN _
  1064.          FF = 0 : _
  1065.          GOTO 10950
  1066.       A$(1) = "ECHO OFF"
  1067.       IF REDIRECT.IO.METHOD THEN _
  1068.          FF = 5 : _
  1069.          A$(2) = "CTTY " + COM.PORT$ : _
  1070.          A$(3) = DISK.FOR.DOS$ + "COMMAND" : _
  1071.          A$(4) = "CTTY CON" : _
  1072.          A$(5) = RBBS.BAT$ _
  1073.       ELSE _
  1074.          FF = 3 : _
  1075.          A$(2) = DISK.FOR.DOS$ + "COMMAND >" + COM.PORT$ + " <" + COM.PORT$ : _
  1076.          A$(3) = RBBS.BAT$
  1077. 10950 SUBROUTINE.PARAMETER = 1
  1078.       CALL AMORPM
  1079.       CALL UPDTCALR ("Exited to DOS at " + TIM$,2)
  1080.       CALL QTPUT("RBBS-PC " + VERSION.ID$,1)
  1081.       CALL QTPUT("SYSOP in Remote Console Mode",1)
  1082.       CALL RBBSEXIT (A$(),FF)
  1083.       END SUB
  1084. ' $SUBTITLE: 'WORDINFILE -- Searches a file to find a word'
  1085. ' $PAGE
  1086. '  SUBROUTINE NAME    -- WORDINFILE
  1087. '
  1088. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1089. '                        FILNAME$      FILE TO SEARCH IN
  1090. '                        STRNG$        STRING TO SEARCH FOR
  1091. '
  1092. '  OUTPUT PARAMETERS  -- INFILE        WHETHER STRING FOUND IN FILE
  1093. '
  1094. '  SUBROUTINE PURPOSE -- SEARCHES FOR "STRNG$" IN FILE "FILNAME$."  USED TO
  1095. '                        LIMIT DOORS AND QUESTIONNAIRES TO THOSE SPECIFIED
  1096. '                        IN THEIR MENU FILES.  THE "STRNG$" IS CAPITALIZED
  1097. '                        BUT NOT THE LINES IN THE FILE, SO MUST BE EXACT
  1098. '                        CASE-SENSITIVE MATCH TO BE FOUND.  THE ONLY CHARACTER
  1099. '                        THAT CAN IMMEDIATELY PROCEED OR END A NAME TO BE
  1100. '                        FOUND MUST BE A BLANK.
  1101. '
  1102.       SUB WORDINFILE (FILNAME$,STRNG$,INFILE) STATIC
  1103. 10976 INFILE = FALSE
  1104.       CALL FINDIT (FILNAME$)
  1105.       IF NOT OK THEN _
  1106.          EXIT SUB
  1107.       X = 0
  1108.       CALL ALLCAPS (STRNG$)
  1109.       WHILE NOT EOF(2) AND X < 1
  1110.         LINE INPUT #2,A$
  1111.         Y = 1
  1112. 10978   X = INSTR(Y,A$,STRNG$)
  1113.         IF X < 1 THEN _
  1114.            GOTO 10980
  1115.         Y = X+1
  1116.         IF X>1 THEN _
  1117.            IF MID$(A$,X-1,1)<>" " THEN _
  1118.               X=0
  1119.         IF X>0 THEN _
  1120.            L = LEN(STRNG$) : _
  1121.            IF LEN(A$) >= (X+L) THEN _
  1122.               IF MID$(A$,X+L,1)<>" " THEN _
  1123.                  X=0
  1124.         IF X=0 THEN _
  1125.            GOTO 10978
  1126. 10980 WEND
  1127.       CLOSE 2
  1128.       INFILE = (X > 0)
  1129.       END SUB
  1130. ' $SUBTITLE: 'DOOREXIT -- Setup to exit to a "door"'
  1131. ' $PAGE
  1132. '  SUBROUTINE NAME    -- DOOREXIT
  1133. '
  1134. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1135. '                        MULTI.LINK.PRESENT
  1136. '                        NODE.ID$
  1137. '                        RBBS.BAT$
  1138. '                        Z$
  1139. '
  1140. '  OUTPUT PARAMETERS  -- Q                    NUMBER OF LINES TO WRITE OUT TO
  1141. '                                             RCTTY.BAT$
  1142. '                        B$()                 LINES TO WRITE OUT TO RCTTY.BAT$
  1143. '
  1144. '  SUBROUTINE PURPOSE -- SET UP B$() AND Q IN ORDER TO CALL "EXITRBBS" AND
  1145. '                        EXIT RBBS-PC TO INVOKE ANTOHER PROGRAM
  1146. '
  1147.       SUB DOOREXIT STATIC
  1148. 10987 A$(1) = DISK.FOR.DOS$+ "COMMAND /C " + Z$ + NODE.ID$
  1149.       A$(2) = RBBS.BAT$
  1150.       A$ = Z$ + " door opened at " + TIME$ + " on " + DATE$
  1151.       SUBROUTINE.PARAMETER = 5
  1152.       CALL TPUT
  1153.       CALL UPDTCALR (LEFT$(Z$,LEN(Z$)-4) + " door opened!",2)
  1154.       CALL RBBSEXIT (A$(),2)
  1155.       END SUB
  1156. ' $SUBTITLE: 'RBBSEXIT -- Setup to exit to a RBBS'
  1157. ' $PAGE
  1158. '  SUBROUTINE NAME    -- RBBSEXIT
  1159. '
  1160. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1161. '                        LINE.ARA        Array of lines to write to batch file
  1162. '                        NUM.LINES       How many lines in array
  1163. '
  1164. '  OUTPUT PARAMETERS  -- RCTTY.BAT$
  1165. '
  1166. '  SUBROUTINE PURPOSE -- TO CREATE A BATCH FILE THAT CONTROL CAN BE PASSED TO
  1167. '                        AND TO EXIT RBBS-PC WHILE STILL KEEPING CARRIER UP
  1168. '
  1169.       SUB RBBSEXIT (LINE.ARA$(1),NUM.LINES) STATIC
  1170. 10992 CLOSE 2
  1171.       IF NUM.LINES = 0 THEN _
  1172.          GOTO 10994
  1173.       OPEN "O",2,RCTTY.BAT$
  1174.       FOR I = 1 TO NUM.LINES
  1175.       IF LINE.ARA$(I) <> "" THEN _
  1176.          PRINT #2,LINE.ARA$(I)
  1177.       NEXT
  1178.       CLOSE 2
  1179. 10994 CLOSE 3
  1180.       EXIT.TO.DOORS = TRUE
  1181.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  1182.       CALL MLINIT (2)
  1183. 10996 IF NOT SYSOP THEN _
  1184.          CALL UPDATEU : _
  1185.          SUBROUTINE.PARAMETER = 8 : _
  1186.          CALL FILELOCK
  1187.       CALL GETIME
  1188.       CALL UPDATEC
  1189.       CALL SAVEPROF (1)
  1190.       IF NUM.LINES = 0 THEN _
  1191.          EXIT SUB
  1192.       SYSTEM
  1193.       END SUB
  1194. ' $SUBTITLE: 'UNTILRIGHT - subroutine to ask question until answer okay'
  1195. ' $PAGE
  1196. '
  1197. '  SUBROUTINE NAME    -- UNTILRIGHT
  1198. '
  1199. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1200. '                        QUES$         QUESTION TO BE ASKED THE USER
  1201. '                        ANS$          LOCATION TO STORE THE ANSWER
  1202. '                        MIN.LEN       MINIMUM LENGTH OF ANSWER
  1203. '                        MAX.LEN       MAX LENGTH OF ANSWER
  1204. '
  1205. '  OUTPUT PARAMETERS  -- ANS$          RESPONSE TO THE QUESTION WHICH THE
  1206. '                                      CALLERS SAYS IS CORRECT
  1207. '
  1208. '  SUBROUTINE PURPOSE -- SUBROUTINE TO ASK A USER A QUESTION UNTIL THE CALLER
  1209. '                        RESPONDS THAT THE ANSWER IS CORRECT
  1210. '
  1211.       SUB UNTILRIGHT (QUES$,ANS$,MIN.LEN,MAX.LEN) STATIC
  1212. 12880 SUBROUTINE.PARAMETER = 1
  1213.       A$ = QUES$
  1214.       CALL TGET
  1215.       IF SUBROUTINE.PARAMETER = -1 THEN _
  1216.          GOTO 12882
  1217.       IF Q=0 THEN _
  1218.          GOTO 12880
  1219.       IF LEN(B$(1))>MAX.LEN THEN _
  1220.          CALL QTPUT (STR$(MAX.LEN)+" chars max",1) :_
  1221.          GOTO 12880_
  1222.       ELSE IF LEN(B$(1)) < MIN.LEN THEN_
  1223.               CALL QTPUT (STR$(MIN.LEN)+" chars min",1) : _
  1224.               GOTO 12880
  1225.       ANS$ = B$(1)
  1226.       A$ = B$(1) + ", right (Y=[ENTER],N)"
  1227.       CALL TGET
  1228.       IF SUBROUTINE.PARAMETER = -1 THEN _
  1229.          GOTO 12882
  1230.       IF NO THEN _
  1231.          GOTO 12880
  1232.       CALL ALLCAPS (ANS$)
  1233.       EXIT SUB
  1234. 12882 ANS$ = "GUEST"
  1235.       END SUB
  1236. ' $SUBTITLE: 'LOGERROR - subroutine to log errors to CALLERS file'
  1237. ' $PAGE
  1238. '
  1239. '  SUBROUTINE NAME    -- LOGERROR
  1240. '
  1241. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  1242. '                               ERR           ERROR NUMBER DETECTED BY BASIC
  1243. '                               ERL           LAST LINE NUMBER ENCOUNTERED
  1244. '                                             PRIOR TO ENCOUNTERNING ERROR
  1245. '
  1246. '  OUTPUT PARAMETERS  -- NONE
  1247. '
  1248. '  SUBROUTINE PURPOSE -- TO SET UP A STRING TO WRITE TO THE CALLERS LOG
  1249. '                        INDICATING THE DATE, TIME, ERROR, AND ERROR LINE
  1250. '
  1251.       SUB LOGERROR STATIC
  1252. 13660 CALL UPDTCALR("+++ Error " + _
  1253.            STR$(ERR) + _
  1254.            " line " + _
  1255.            STR$(ERL) + _
  1256.            " at " + _
  1257.            TIME$ + _
  1258.            " on " + _
  1259.            DATE$,2)
  1260.       END SUB
  1261. ' $SUBTITLE: 'BADNAME - subroutine to find bad file names'
  1262. ' $PAGE
  1263. '
  1264. '  SUBROUTINE NAME    -- BADNAME
  1265. '
  1266. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  1267. '                        ACTIVE.MESSAGE.FILE$
  1268. '                        ACTIVE.USER.FILE$
  1269. '                        CALLERS.FILE$
  1270. '                        COMMENTS.FILE$
  1271. '                        CONFIG.FILEANAME$
  1272. '                        MAIN.MESSAGE.BACKUP$
  1273. '                        MAIN.MESSAGE.FILE$
  1274. '                        MAXIMUM.VIOLATIONS
  1275. '                        PASSWORDS.FILE$
  1276. '                        RBBS.BAT$
  1277. '                        RCTTY.BAT$
  1278. '                        SUBDIR$()
  1279. '                        SUBDIR.INDEX
  1280. '                        VIOLATION$
  1281. '                        VIOLATIONS.THIS.SESSION
  1282. '                        Z$                          NAME OF FILE
  1283. '
  1284. '  OUTPUT PARAMETERS  -- BAD.FILE.NAME.INDEX         1 = FILE NAME IS OK
  1285. '                                                    2 = SECURITY BREACH TRIED
  1286. '                        VIOLATIONS.THIS.SESSION     NUMBER OF VIOLATIONS
  1287. '                        FILENAME$                   NAME OF FILE
  1288. '
  1289. '  SUBROUTINE PURPOSE -- TO PROTECT RBBS-PC AGAINST THE USE OF BAD FILE NAMES
  1290. '                        TO EITHER CRASH THE SYSTEM OR TO BREACH RBBS-PC'S
  1291. '                        SECURITY
  1292. '
  1293.       SUB BADNAME (BAD.FILE.NAME.INDEX) STATIC                       ' CPC15-1B
  1294. '
  1295. ' *****************************************************************************
  1296. ' *  TEST FOR SYSTEM FILE ATTEMPT                                             *
  1297. ' *****************************************************************************
  1298. '
  1299. 20235 BAD.FILE.NAME.INDEX = 1
  1300.       Z$ = FILE.NAME$
  1301.       IF INSTR(3,FILE.NAME$,MID$(ACTIVE.MESSAGE.FILE$,3,(LEN(ACTIVE.MESSAGE.FILE$)-2))) THEN _
  1302.          GOTO 20236
  1303.       IF INSTR(3,FILE.NAME$,MID$(ACTIVE.USER.FILE$,3,(LEN(ACTIVE.USER.FILE$)-2))) THEN _
  1304.          GOTO 20236
  1305.       IF INSTR(3,FILE.NAME$,MID$(ACTIVE.USER.FILE$+".BAK",3,(LEN(ACTIVE.USER.FILE$+".BAK")-2))) THEN _
  1306.          GOTO 20236
  1307.       IF INSTR(3,FILE.NAME$,MID$(CALLERS.FILE$,3,(LEN(CALLERS.FILE$)-2))) THEN _
  1308.          GOTO 20236
  1309.       IF INSTR(3,FILE.NAME$,MID$(COMMENTS.FILE$,3,(LEN(COMMENTS.FILE$)-2))) THEN _
  1310.          GOTO 20236
  1311.       IF INSTR(3,FILE.NAME$,MID$(FILESEC.FILE$,3,(LEN(FILESEC.FILE$)-2))) THEN _
  1312.          GOTO 20236
  1313.       IF INSTR(3,FILE.NAME$,MID$(MAIN.MESSAGE.BACKUP$,3,(LEN(MAIN.MESSAGE.BACKUP$)-2))) THEN _
  1314.          GOTO 20236
  1315.       IF INSTR(3,FILE.NAME$,MID$(MAIN.MESSAGE.FILE$,3,(LEN(MAIN.MESSAGE.FILE$)-2))) THEN _
  1316.          GOTO 20236
  1317.       IF INSTR(3,FILE.NAME$,MID$(MAIN.USER.FILE$,3,(LEN(MAIN.USER.FILE$)-2))) THEN _
  1318.          GOTO 20236
  1319.       IF INSTR(3,FILE.NAME$,MID$(MAIN.USER.FILE$+".BAK",3,(LEN(MAIN.USER.FILE$+".BAK")-2))) THEN _
  1320.          GOTO 20236
  1321.       IF INSTR(3,FILE.NAME$,MID$(PASSWORDS.FILE$,3,(LEN(PASSWORDS.FILE$)-2))) THEN _
  1322.          GOTO 20236
  1323.       IF INSTR(3,FILE.NAME$,MID$(RBBS.BAT$,3,(LEN(RBBS.BAT$)-2))) THEN _
  1324.          GOTO 20236
  1325.       IF INSTR(3,FILE.NAME$,MID$(RCTTY.BAT$,3,(LEN(RCTTY.BAT$)-2))) THEN _
  1326.          GOTO 20236
  1327.       CALL BRKFNAME (CONFIG.FILENAME$,DR$,PREFIX$,EXTENSION$,FALSE)
  1328.       IF INSTR(3,FILE.NAME$,MID$(CONFIG.FILENAME$,LEN(DR$)+1)) THEN _
  1329.          GOTO 20236
  1330.       EXIT SUB
  1331. 20236 BAD.FILE.NAME.INDEX = 2
  1332.       END SUB
  1333. ' $SUBTITLE: 'BRKFNAME - subroutine to split file name into components'
  1334. ' $PAGE
  1335. '
  1336. '  SUBROUTINE NAME    -- BRKFNAME
  1337. '
  1338. '  INPUT PARAMETERS   -- PARAMETER                    MEANING
  1339. '                        FILENAME$        FULL NAME OF FILE
  1340. '                        FOR.JOINING      TRUE IF WANT PARTS FORMATTED FOR
  1341. '                                           FORMING FILE NAMES
  1342. '  OUTPUT PARAMETERS  -- DRVPATH$         DRIVE AND PATH
  1343. '                        PREFIX$          PREFIX OF FILE NAME
  1344. '                        EXTENSION$       EXTENSION OF FILE NAME
  1345. '
  1346. ' (E.G. "C:\RBBS\ARCE.COM" HAS "C:\RBBS" AS DRIVE AND PATH,
  1347. '                              "ARCE"    AS PREFIX OF THE FILE NAME, AND
  1348. '                              "COM"     AS THE EXTENSION OF THE FILE NAME.
  1349. '
  1350. ' JOINED FORMAT IS C:\RBBS\,ARCE,.COM
  1351. '
  1352. '  SUBROUTINE PURPOSE -- TO BREAK A FILE NAME INTO ITS COMPONENT PARTS
  1353. '                        OF DRIVE/PATH, PREFIX, AND EXTENSION
  1354. '
  1355. '
  1356.       SUB BRKFNAME (FILENAME$,DRVPATH$,PREFIX$,EXTENSION$,FOR.JOINING) STATIC
  1357. 20282 CALL ALLCAPS (FILENAME$)
  1358.       DRVPATH$ = ""
  1359.       PREFIX$ = ""
  1360.       EXTENSION$ = ""
  1361.       IF LEN(FILENAME$) < 1 THEN _
  1362.          EXIT SUB
  1363.       CALL FINDLAST (FILENAME$,"\",X,Y)
  1364.       IF X < 1 THEN _
  1365.          IF MID$(FILENAME$,2,1) = ":" THEN _
  1366.             DRVPATH$ = LEFT$(FILENAME$,1): _
  1367.             S = 3 _
  1368.          ELSE S = 1 _
  1369.       ELSE DRVPATH$ = LEFT$(FILENAME$,X-1) : _
  1370.            S = X + 1
  1371.       X = INSTR(FILENAME$+".",".")
  1372.       EXTENSION$ = MID$(FILENAME$,X+1,3)
  1373.       PREFIX$ = MID$(FILENAME$,S,X-S)
  1374.       IF NOT FOR.JOINING THEN _
  1375.          EXIT SUB
  1376.       IF LEN(DRVPATH$) = 1 THEN _
  1377.          DRVPATH$ = DRVPATH$ + ":"
  1378.       IF INSTR(DRVPATH$,"\") > 0 THEN _
  1379.          DRVPATH$ = DRVPATH$ + "\"
  1380.       IF LEN(EXTENSION$) > 0 THEN _
  1381.          EXTENSION$ = "." + EXTENSION$
  1382.       END SUB
  1383. ' $SUBTITLE: 'WILDCARD -- Matches string to a pattern'
  1384. ' $PAGE
  1385. '  SUBROUTINE NAME    -- WILDCARD
  1386. '
  1387. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1388. '                        PATTERN$           PATTERN TO CHECK
  1389. '                        STRNG$             STRING TO FIE
  1390. '
  1391. '  OUTPUT PARAMETERS  -- OK                 TRUE IF MATCH FOUND
  1392. '                                           FALSE IF NO MATCH WAS FOUND
  1393. '
  1394. '  SUBROUTINE PURPOSE  DETERMINE WHETHER A STRING IS AN INSTANCE IN A PATTERN
  1395. '                      SUPPORTED PATTERNS ARE ONLY "?" WHICH REQUIRES A
  1396. '                      CHARACTER BUT CAN BE ANY, AND "*" WHICH MATCHES ANY-
  1397. '                      THING, INCLUDING A NULL STRING.  ANYTHING ELSE IN A
  1398. '                      MUST BE AN EXACT MATCH.
  1399. '
  1400.       SUB WILDCARD (PATTERN$,STRNG$) STATIC
  1401. 20285 OK = TRUE
  1402.       K = 0
  1403.       L = LEN(STRNG$)
  1404. 20286 K = K + 1
  1405.       IF K > L THEN _
  1406.          GOTO 20288
  1407.       B$ = MID$(PATTERN$,K,1)
  1408.       IF B$ = "*" THEN _
  1409.          EXIT SUB
  1410. 20287 IF B$ <> "?" AND MID$(STRNG$,K,1) <> B$ THEN _
  1411.      OK = FALSE : _
  1412.          EXIT SUB
  1413.       GOTO 20286
  1414. 20288 IF L < LEN(PATTERN$) AND MID$(PATTERN$,L + 1,1) <> "*" THEN _
  1415.      OK = FALSE
  1416.       END SUB
  1417. ' $SUBTITLE: 'UPDTUPLOAD -- Updates upload directory'
  1418. ' $PAGE
  1419. '  SUBROUTINE NAME    -- UPDTUPLOAD
  1420. '
  1421. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1422. '                        FILE.NAME$
  1423. '                        UPLOAD.DIRECTORY$
  1424. '                        FILE.NAME.HOLD$
  1425. '                        SHARE.IT
  1426. '                        FMS.DIRECTORY$
  1427. '                        Q!
  1428. '                        TCA!
  1429. '
  1430. '  OUTPUT PARAMETERS  -- BYTES.IN.FILE#
  1431. '                        SECONDS.PER.SESSION!
  1432. '
  1433. '  SUBROUTINE PURPOSE -- UPON A SUCCESSFUL UPLOAD, ADD ENTRY TO THE UPLOAD
  1434. '                        DIRECTORY AND GIVE ANY SESSION TIME CREDIT.
  1435. '
  1436.       SUB UPDTUPLOAD (CATEGORY.NAME$(1),CATEGORY.CODE$(1)) STATIC
  1437. 20705 CALL FINDIT (FILE.NAME$)
  1438.       IF NOT OK THEN _
  1439.          BYTES.IN.FILE# = 0.0_
  1440.       ELSE_
  1441.          BYTES.IN.FILE# = LOF(2)
  1442.       IF BYTES.IN.FILE# < 1.0 THEN _
  1443.          EXIT SUB
  1444.       CALL QTPUT("Upload successful",1)
  1445.       X$ = DATE$
  1446.       Z$ = LEFT$(X$,6) + RIGHT$(X$,2)
  1447.       STREW.TO$ = ""
  1448.       Y$ = ""
  1449. 20710 CALL QTPUT("Describe " + FILE.NAME.HOLD$ + _
  1450.            " (/ if for SYSOP only)",1)
  1451.       CALL QTPUT(LEFT$(" |----+---1+0---+---2+0---+---3+0---+---4+0---+-",_
  1452.                  MAX.DESC.LEN+3),1)
  1453.       A$=""
  1454.       SUBROUTINE.PARAMETER = 1
  1455.       CALL TGET
  1456.       CALL CARRIER
  1457.       IF SUBROUTINE.PARAMETER = -1 THEN _
  1458.          B$(1) = "<description unavailable>": _                      ' CPC15-1B
  1459.          GOTO 20712
  1460.       IF LEN(B$(1)) > MAX.DESC.LEN OR LEN(B$(1)) < 10 THEN _         ' CPC15-1B
  1461.          GOTO 20710
  1462. 20712 B$ = B$(1)
  1463.       DESC$ = B$
  1464.       IF FMS.DIRECTORY$ <> UPLOAD.DIRECTORY$ THEN _
  1465.          IF LEFT$(B$,1) = "/" THEN _
  1466.             CALL UPDTCALR (B$,2) : _
  1467.             GOTO 20726_
  1468.          ELSE_
  1469.             GOTO 20717
  1470. 20715 IF LEFT$(B$,1) = "/" THEN _
  1471.          B$ = MID$(B$(1),2) : _
  1472.          Y$ = "***" : _
  1473.          GOTO 20722
  1474.       Y$ = DEFAULT.CATEGORY.CODE$
  1475. 20717 IF SUBROUTINE.PARAMETER = -1 OR _
  1476.          USER.SECURITY.LEVEL < SL.CATEGORIZE.UPLOADS THEN _
  1477.          GOTO 20722
  1478. 20719 CALL BUFFILE (UPCAT.HELP$)
  1479. 20720 A$ = "Upload best fits what category (H=help)"
  1480.       SUBROUTINE.PARAMETER = 1
  1481.       CALL TGET
  1482.       IF SUBROUTINE.PARAMETER = -1 THEN _
  1483.          B$ = DEFAULT.CATEGORY.CODE$ : _
  1484.          GOTO 20722
  1485.       IF Q = 0 THEN _
  1486.          GOTO 20719
  1487.       CALL ALLCAPS (B$(1))
  1488.       IF B$(1) = "H" THEN _
  1489.          GOTO 20719
  1490.       CALL CHKNARY (B$(1),CATEGORY.NAME$(),NUM.CATEGORIES,FOUND)
  1491.       IF FOUND>0 THEN _
  1492.          Y$ = CATEGORY.CODE$(FOUND) : _
  1493.          IF LEN(Y$) > 0 AND LEN(Y$) < 4 AND INSTR(Y$,",")=0 THEN _
  1494.             GOTO 20722
  1495.       Y$ = ""
  1496.       IF NOT LIMIT.SEARCH.TO.FMS THEN _
  1497.          STREW.TO$ = DIRECTORY.PATH$ + B$(1) + "." + DIRECTORY.EXTENTION$ : _
  1498.          CALL FINDIT (STREW.TO$) : _
  1499.          IF NOT OK THEN _
  1500.             STREW.TO$ = "" _                                         ' CPC15-1B
  1501.          ELSE GOTO 20722                                             ' CPC15-1B
  1502.       CALL QTPUT ("No such category "+B$(1),1)
  1503.       GOTO 20719
  1504. 20722 B$ = DESC$
  1505.       EN$ = ALWAYS.STREW.TO$
  1506.       GOSUB 20730
  1507.       EN$ = STREW.TO$
  1508.       GOSUB 20730
  1509. 20725 EN$ = UPLOAD.DIRECTORY$
  1510.       IF FMS.DIRECTORY$ = UPLOAD.DIRECTORY$ THEN _
  1511.          B$ = DESC$ + SPACE$(MAX.DESC.LEN-LEN(DESC$)) + Y$ + SPACE$(3-LEN(Y$))
  1512.       GOSUB 20730
  1513. 20726 Y$ = " >> uploaded << "
  1514.       UPLOADS = UPLOADS + 1
  1515.       CALL MUSIC (7)
  1516.       CALL TIMEREMAIN (TIME.REMAINING!)
  1517.       SECONDS.PER.SESSION! = SECONDS.PER.SESSION! + _
  1518.                              UPLOAD.TIME.FACTOR! * _
  1519.                              (TCA!-Q!)
  1520.       EXIT SUB
  1521. 20730 '          ---[ lock file ]---
  1522.       IF EN$ = "" THEN _
  1523.          RETURN
  1524.       BX = &H4
  1525.       SUBROUTINE.PARAMETER = 9
  1526.       CALL FILELOCK
  1527.       CLOSE 2
  1528.       IF SHARE.IT THEN _
  1529.          OPEN EN$ FOR APPEND SHARED AS #2 _
  1530.       ELSE OPEN "A",2,EN$
  1531.       '          ---[ append ]---
  1532.       PRINT #2,USING "\           \########  &  &"; _
  1533.                      FILE.NAME.HOLD$; _
  1534.                      BYTES.IN.FILE#; _
  1535.                      Z$; _
  1536.                      B$
  1537.       CLOSE 2
  1538.       '          ---[ unlock ]---
  1539.       BX = &H4
  1540.       SUBROUTINE.PARAMETER = 10
  1541.       CALL FILELOCK
  1542.       RETURN
  1543.       END SUB
  1544. ' $SUBTITLE: 'BADFILE - subroutine to find bad file names'
  1545. ' $PAGE
  1546. '
  1547. '  SUBROUTINE NAME    -- BADFILE
  1548. '
  1549. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  1550. '                        VIOLATION$
  1551. '                        VIOLATIONS.THIS.SESSION
  1552. '                        FILNAME$                      NAME OF FILE
  1553. '
  1554. '  OUTPUT PARAMETERS  -- RESULT                      1 = FILE NAME IS OK
  1555. '                                                    2 = CHARACTER NOT ALLOWED
  1556. '                                                    3 = SYSTEM CRASH ATTEMPT
  1557. '                        VIOLATIONS.THIS.SESSION     NUMBER OF VIOLATIONS
  1558. '                        FILNAME$                    Gets capitalized
  1559. '
  1560. '  SUBROUTINE PURPOSE -- TO PROTECT RBBS-PC AGAINST THE USE OF BAD FILE NAMES
  1561. '                        TO EITHER CRASH THE SYSTEM OR TO BREACH RBBS-PC'S
  1562. '                        SECURITY
  1563. '
  1564.       SUB BADFILE (FILNAME$,RESULT) STATIC
  1565. '
  1566. ' *****************************************************************************
  1567. ' *  TEST FOR INVALID CHARACTERS IN FILENAME                                  *
  1568. ' *****************************************************************************
  1569. '
  1570. 20741 RESULT = 1
  1571.       IF LEN(FILNAME$) < 1 THEN _
  1572.          RESULT = 2 : _
  1573.          EXIT SUB
  1574.       CALL ALLCAPS (FILNAME$)
  1575.       IF INSTR(FILNAME$,"?") OR _
  1576.          INSTR(FILNAME$,"*") OR _
  1577.          INSTR(FILNAME$," ") OR _
  1578.          INSTR(3,FILNAME$,":") OR _
  1579.          INSTR(FILNAME$,".DEF") OR _
  1580.          INSTR(FILNAME$,".OLD") OR _
  1581.          MID$(FILNAME$,LEN(FILNAME$),1) = "." THEN _
  1582.            RESULT = 2 : _
  1583.            EXIT SUB
  1584.       FF = INSTR(FILNAME$,".")
  1585.       IF FF > 0 THEN _
  1586.          FF = INSTR(FF+1,FILNAME$,".") : _
  1587.          IF FF > 0 THEN _
  1588.             RESULT = 2 : _
  1589.             EXIT SUB
  1590.       FF = LEN(FILNAME$)
  1591.       IF FF >= 3 THEN _
  1592.          IF INSTR("PRN:CON:AUX:NUL:",FILNAME$) THEN _
  1593.             GOTO 20742
  1594.       IF FF >= 4 THEN _
  1595.          IF INSTR("COM1:COM2:LPT1:LPT2:LPT3:SCRN:KYBD:CONS:",FILNAME$) THEN _
  1596.             GOTO 20742
  1597.       IF FF > 12 THEN _
  1598.          RESULT = 2
  1599.       FG = INSTR(FILNAME$,".")
  1600.       IF FG = 0 AND FF > 8 THEN _
  1601.          RESULT = 2 _
  1602.       ELSE IF FG > 9 THEN _
  1603.               RESULT = 2
  1604.       EXIT SUB
  1605. 20742 VIOLATIONS.THIS.SESSION = MAXIMUM.VIOLATIONS
  1606.       VIOLATION$ = VIOLATION$ + FILNAME$
  1607.       RESULT = 3
  1608.       END SUB
  1609. ' $SUBTITLE: 'FILELOCK - subroutine to share RBBS-PC files'
  1610. ' $PAGE
  1611. '
  1612. '  SUBROUTINE NAME    -- FILELOCK
  1613. '
  1614. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  1615. '                        SUBROUTINE.PARAMETER = 1 UNLOCK USERS AND MESSAGES
  1616. '                                               2 FLUSH MESSAGE RECORD TO DISK
  1617. '                                                 AND UNLOCK MESSAGES
  1618. '                                               3 LOCK MESSAGE FILE
  1619. '                                               4 UNLOCK MESSAGE FILE
  1620. '                                               5 LOCK USER FILE
  1621. '                                               6 LOCK 4 RECORD BLOCK IN USER
  1622. '                                                 FILE
  1623. '                                               7 UNLOCK USER FILE
  1624. '                                               8 UNLOCK 4 RECORD BLOCK IN USER
  1625. '                                                 FILE
  1626. '                                               9 LOCK UPLOAD DIRECTORY OR
  1627. '                                                 COMMENTS FILE
  1628. '                                              10 UNLOCK UPLOAD DIRECTORY OR
  1629. '                                                 COMMENTS FILE
  1630. '                        ACTIVE.MESSAGE FILE$   NAME OF MESSAGE FILE
  1631. '                        ACTIVE.USER.FILE$      NAME OF USER FILE
  1632. '                        CONFIG.FILE.NAME$      FILE NAME TO FLUSH RECORD FROM
  1633. '                        EN$                    UPLOAD DIRECTORY OR COMMENTS
  1634. '                                               FILE NAME TO LOCK/UNLOCK
  1635. '                        NETWORK.TYPE           TYPE OF NETWORK LOCKING TO USE
  1636. '
  1637. '  OUTPUT PARAMETERS  -- SUBROUTINE.PARAMETER = -1 TERMINATE RBBS-PC IMMEDATELY
  1638. '                        BLK
  1639. '                        LOCK.DRIVE
  1640. '                        LOCK.FILE.NAME$
  1641. '                        LOCK.STATUS$
  1642. '                        MESSAGE.FILE.LOCK
  1643. '                        USER.BLOCK.LOCK
  1644. '                        USER.FILE.LOCK
  1645. '                        USER.FILE.INDEX
  1646. '
  1647. '  SUBROUTINE PURPOSE -- TO LOCK AND UNLOCK THE SHARED RBBS-PC FILES WHEN
  1648. '                        MULTIPLE COPIES OF RBBS-PC ARE SHARING THE SAME
  1649. '                        FILES IN EITHER A MULTI-TASKING DOS ENVIRONMENT OR
  1650. '                        IN A LOCAL AREA NETWORK ENVIRONMENT
  1651.       SUB FILELOCK STATIC
  1652.       ON SUBROUTINE.PARAMETER GOSUB 21995,21996,22000,25000,26000,26500,27000,_
  1653.                                     27500,29000,29500
  1654.       EXIT SUB
  1655. '
  1656. ' *****************************************************************************
  1657. ' *  UNLOCK USERS AND MESSAGES                                                *
  1658. ' *****************************************************************************
  1659. '
  1660. 21995 GOSUB 27000
  1661.       GOSUB 25000
  1662.       RETURN
  1663. '
  1664. ' *****************************************************************************
  1665. ' *  FLUSH MESSAGE FILE DATA TO DISK BY OPENING DUMMY FILE # 1                *
  1666. ' *****************************************************************************
  1667. '
  1668. 21996 CLOSE 1
  1669.       IF SHARE.IT THEN _
  1670.          OPEN CONFIG.FILENAME$ FOR INPUT SHARED AS #1 _
  1671.          ELSE OPEN "I",1,CONFIG.FILENAME$
  1672.       CLOSE 1
  1673. '
  1674. ' *****************************************************************************
  1675. ' *  UNLOCK MESSAGES                                                          *
  1676. ' *****************************************************************************
  1677. '
  1678.       GOSUB 25000
  1679.       RETURN
  1680. '
  1681. ' *****************************************************************************
  1682. ' *  LOCK MESSAGE FILE                                                        *
  1683. ' *****************************************************************************
  1684. '
  1685. 22000 IF MESSAGE.FILE.LOCK = TRUE THEN _
  1686.          RETURN
  1687.       MESSAGE.FILE.LOCK = TRUE
  1688.       MID$(LOCK.STATUS$,1,2) = "LM"
  1689.       SUBROUTINE.PARAMETER = 2
  1690.       CALL LINE25
  1691.       LOCK.FILE.NAME$ = ACTIVE.MESSAGE.FILE$
  1692.       ON NETWORK.TYPE GOTO 22100,22200,22300,22400,22500
  1693.       RETURN
  1694. '
  1695. ' *****************************************************************************
  1696. ' *  LOCK MESSAGE FILE (MULTI-LINK)                                           *
  1697. ' *****************************************************************************
  1698. '
  1699. 22100 AX = &H0
  1700.       BX = &H1
  1701.       CALL RBBSML(AX,BX)
  1702.       RETURN
  1703. '
  1704. ' *****************************************************************************
  1705. ' *  LOCK MESSAGE FILE (OMNINET)                                              *
  1706. ' *****************************************************************************
  1707. '
  1708. 22200 CC$ = CHR$(1) + MID$(ACTIVE.MESSAGE.FILE$ + SPACE$(8),3,8)
  1709.       GOSUB 28000
  1710.       IF CT = 0 THEN _
  1711.          RETURN
  1712.       CALL DELAYIT (1)
  1713.       GOTO 22200
  1714. '
  1715. ' *****************************************************************************
  1716. ' *  LOCK MESSAGE FILE (ORCHID PC-NET)                                        *
  1717. ' *  LOCK USER FILE (ORCHID PC-NET)                                           *
  1718. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (ORCHID PC-NET)           *
  1719. ' *****************************************************************************
  1720. '
  1721. 22300 GOSUB 28100
  1722.       CALL LPLKIT(LOCK.DRIVE,LOCK.FILE.NAME$,A)
  1723.       RETURN
  1724. '
  1725. ' *****************************************************************************
  1726. ' *  LOCK SYSTEM (DESQview)                                                   *
  1727. ' *****************************************************************************
  1728. '
  1729. 22400 AX = 1
  1730.       BX = 0
  1731.       CALL RBBSDV(AX,BX)
  1732.       RETURN
  1733. '
  1734. ' *****************************************************************************
  1735. ' *  LOCK MESSAGE FILE (10 NET)                                               *
  1736. ' *  LOCK USER FILE (10 NET)                                                  *
  1737. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (10 NET)                  *
  1738. ' *****************************************************************************
  1739. '
  1740. 22500 GOSUB 28100
  1741.       CALL LPLK10(LOCK.DRIVE,LOCK.FILE.NAME$,A)
  1742.       RETURN
  1743. '
  1744. ' *****************************************************************************
  1745. ' *  UNLOCK MESSAGE FILE                                                      *
  1746. ' *****************************************************************************
  1747. '
  1748. 25000 MESSAGE.FILE.LOCK = FALSE
  1749.       MID$(LOCK.STATUS$,1,2) = "UM"
  1750.       SUBROUTINE.PARAMETER = 2
  1751.       CALL LINE25
  1752.       LOCK.FILE.NAME$ = ACTIVE.MESSAGE.FILE$
  1753.       ON NETWORK.TYPE GOTO 25100,25200,25300,25400,25500
  1754.       RETURN
  1755. '
  1756. ' *****************************************************************************
  1757. ' *  UNLOCK MESSAGE FILE (MULTI-LINK)                                         *
  1758. ' *****************************************************************************
  1759. '
  1760. 25100 AX = &H100
  1761.       BX = &H1
  1762.       CALL RBBSML(AX,BX)
  1763.       RETURN
  1764. '
  1765. ' *****************************************************************************
  1766. ' *  UNLOCK MESSAGE FILE (OMNINET)                                            *
  1767. ' *****************************************************************************
  1768. '
  1769. 25200 CC$ = CHR$(17) + MID$(ACTIVE.MESSAGE.FILE$ + SPACE$(8),3,8)
  1770.       GOSUB 28000
  1771.       IF CT = 128 THEN _
  1772.          RETURN
  1773.       CALL DELAYIT (1)
  1774.       GOTO 25200
  1775. '
  1776. ' *****************************************************************************
  1777. ' *  UNLOCK MESSAGE FILE (ORCHID PC-NET)                                      *
  1778. ' *  UNLOCK USER FILE (ORCHID PC-NET)                                         *
  1779. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (ORCHID PC-NET)         *
  1780. ' *****************************************************************************
  1781. '
  1782. 25300 GOSUB 28100
  1783.       CALL UNLOKIT(LOCK.DRIVE,LOCK.FILE.NAME$,A)
  1784.       RETURN
  1785. '
  1786. ' *****************************************************************************
  1787. ' *  UNLOCK SYSTEM (DESQview)                                                 *
  1788. ' *****************************************************************************
  1789. '
  1790. 25400 AX = 2
  1791.       BX = 0
  1792.       CALL RBBSDV(AX,BX)
  1793.       RETURN
  1794. '
  1795. ' *****************************************************************************
  1796. ' *  UNLOCK MESSAGE FILE (10 NET)                                             *
  1797. ' *  UNLOCK USER FILE (10 NET)                                                *
  1798. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (10 NET)                *
  1799. ' *****************************************************************************
  1800. '
  1801. 25500 GOSUB 28100
  1802.       CALL UNLOK10(LOCK.DRIVE,LOCK.FILE.NAME$,A)
  1803.       RETURN
  1804.  
  1805. '
  1806. ' *****************************************************************************
  1807. ' *  LOCK USER FILE                                                           *
  1808. ' *****************************************************************************
  1809. '
  1810. 26000 IF USER.FILE.LOCK = TRUE THEN _
  1811.          RETURN
  1812.       USER.FILE.LOCK = TRUE
  1813.       MID$(LOCK.STATUS$,4,2) = "LU"
  1814.       SUBROUTINE.PARAMETER = 2
  1815.       CALL LINE25
  1816.       LOCK.FILE.NAME$ = ACTIVE.USER.FILE$
  1817.       ON NETWORK.TYPE GOTO 26100,26200,22300,22400,22500
  1818.       RETURN
  1819. '
  1820. ' *****************************************************************************
  1821. ' *  LOCK USER FILE (MULTI-LINK)                                              *
  1822. ' *****************************************************************************
  1823. '
  1824. 26100 AX = &H0
  1825.       BX = &H2
  1826.       CALL RBBSML(AX,BX)
  1827.       RETURN
  1828. '
  1829. ' *****************************************************************************
  1830. ' *  LOCK USER FILE (OMNINET)                                                 *
  1831. ' *****************************************************************************
  1832. '
  1833. 26200 CC$ = CHR$(1) + MID$(ACTIVE.USER.FILE$ + SPACE$(8),3,8)
  1834.       GOSUB 28000
  1835.       IF CT = 0 THEN _
  1836.          RETURN
  1837.       CALL DELAYIT (1)
  1838.       GOTO 26200
  1839. '
  1840. ' *****************************************************************************
  1841. ' *  LOCK 4 RECORD BLOCK IN USER FILE                                         *
  1842. ' *****************************************************************************
  1843. '
  1844. 26500 IF USER.BLOCK.LOCK = TRUE THEN _
  1845.          RETURN
  1846.       USER.BLOCK.LOCK = TRUE
  1847.       BLK = (USER.FILE.INDEX / 4) + .26
  1848.       MID$(LOCK.STATUS$,7,2) = "LB"
  1849.       SUBROUTINE.PARAMETER = 2
  1850.       CALL LINE25
  1851.       ON NETWORK.TYPE GOTO 26600,26700,26800,22400,26900
  1852.       RETURN
  1853. '
  1854. ' *****************************************************************************
  1855. ' *  LOCK 4 RECORD BLOCK IN USER FILE (MULTI-LINK)                            *
  1856. ' *****************************************************************************
  1857. '
  1858. 26600 AX = &H0
  1859.       BX = BLK + 10
  1860.       CALL RBBSML(AX,BX)
  1861.       RETURN
  1862. '
  1863. ' *****************************************************************************
  1864. ' *  LOCK 4 RECORD BLOCK IN USER FILE (OMNINET)                               *
  1865. ' *****************************************************************************
  1866. '
  1867. 26700 CC$ = CHR$(1) + "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  1868.       GOSUB 28000
  1869.       IF CT = 0 THEN _
  1870.          RETURN
  1871.       CALL DELAYIT (1)
  1872.       GOTO 26700
  1873. '
  1874. ' *****************************************************************************
  1875. ' *  LOCK 4 RECORD BLOCK IN USER FILE (ORCHID PC-NET)                         *
  1876. ' *****************************************************************************
  1877. '
  1878. 26800 LOCK.FILE.NAME$ = LEFT$(ACTIVE.USER.FILE$,2) + "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  1879.       GOTO 22300
  1880. '
  1881. ' *****************************************************************************
  1882. ' *  LOCK 4 RECORD BLOCK IN USER FILE (10 NET)                                *
  1883. ' *****************************************************************************
  1884. '
  1885. 26900 LOCK.FILE.NAME$ = LEFT$(ACTIVE.USER.FILE$,2) + "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  1886.       GOTO 22500
  1887. '
  1888. ' *****************************************************************************
  1889. ' *  UNLOCK USER FILE                                                         *
  1890. ' *****************************************************************************
  1891. '
  1892. 27000 USER.FILE.LOCK = FALSE
  1893.       MID$(LOCK.STATUS$,4,2) = "UU"
  1894.       SUBROUTINE.PARAMETER = 2
  1895.       CALL LINE25
  1896.       LOCK.FILE.NAME$ = ACTIVE.USER.FILE$
  1897.       ON NETWORK.TYPE GOTO 27100,27200,25300,25400,25500
  1898.       RETURN
  1899. '
  1900. ' *****************************************************************************
  1901. ' *  UNLOCK USER FILE (MULTI-LINK)                                            *
  1902. ' *****************************************************************************
  1903. '
  1904. 27100 AX = &H100
  1905.       BX = &H2
  1906.       CALL RBBSML(AX,BX)
  1907.       RETURN
  1908. '
  1909. ' *****************************************************************************
  1910. ' *  UNLOCK USER FILE (OMNINET)                                               *
  1911. ' *****************************************************************************
  1912. '
  1913. 27200 CC$ = CHR$(17) + MID$(ACTIVE.USER.FILE$ + SPACE$(8),3,8)
  1914.       GOSUB 28000
  1915.       IF CT = 128 THEN _
  1916.          RETURN
  1917.       CALL DELAYIT (1)
  1918.       GOTO 27200
  1919.  
  1920. '
  1921. ' *****************************************************************************
  1922. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE                                       *
  1923. ' *****************************************************************************
  1924. '
  1925. 27500 USER.BLOCK.LOCK = FALSE
  1926.       BLK = (USER.FILE.INDEX / 4) + .26
  1927.       MID$(LOCK.STATUS$,7,2) = "UB"
  1928.       SUBROUTINE.PARAMETER = 2
  1929.       CALL LINE25
  1930.       ON NETWORK.TYPE GOTO 27600,27700,27800,25400,27900
  1931.       RETURN
  1932. '
  1933. ' *****************************************************************************
  1934. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (MULTI-LINK)                          *
  1935. ' *****************************************************************************
  1936. '
  1937. 27600 AX = &H100
  1938.       BX = BLK + 10
  1939.       CALL RBBSML(AX,BX)
  1940.       RETURN
  1941. '
  1942. ' *****************************************************************************
  1943. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (OMNINET)                             *
  1944. ' *****************************************************************************
  1945. '
  1946. 27700 CC$ = CHR$(17) + "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  1947.       GOSUB 28000
  1948.       IF CT = 128 THEN _
  1949.          RETURN
  1950.       CALL DELAYIT (1)
  1951.       GOTO 27700
  1952. '
  1953. ' *****************************************************************************
  1954. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (ORCHID PC-NET)                       *
  1955. ' *****************************************************************************
  1956. '
  1957. 27800 LOCK.FILE.NAME$ = LEFT$(ACTIVE.USER.FILE$,2) + "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  1958.       GOTO 25300
  1959. '
  1960. ' *****************************************************************************
  1961. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (ORCHID PC-NET)                       *
  1962. ' *****************************************************************************
  1963. '
  1964. 27900 LOCK.FILE.NAME$ = LEFT$(ACTIVE.USER.FILE$,2) + "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  1965.       GOTO 25500
  1966. '
  1967. ' *****************************************************************************
  1968. ' *  CORVUS OMNINET INTERFACE                                                 *
  1969. ' *****************************************************************************
  1970. '
  1971. 28000 CC$ = LINE.FEED$ + CHR$(0) + CHR$(11) + CC$
  1972.       CALL CDSEND(CC$)
  1973.       CALL CDRECV(CN$)
  1974.       CT = ASC(MID$(CN$,3,1))
  1975.       IF CT >= 128 THEN _
  1976.          PRINT "CORVUS LOCK FAIL" : _
  1977.          SUBROUTINE.PARAMETER = -1
  1978. 28010 CT = ASC(MID$(CN$,4,1))
  1979.       IF CT >= 129 THEN _
  1980.          PRINT "CORVUS FULL" : _
  1981.          SUBROUTINE.PARAMETER = -1
  1982.       RETURN
  1983. '
  1984. ' *****************************************************************************
  1985. ' *  ORCHID PC-NET & 10 NET INTERFACE                                         *
  1986. ' *****************************************************************************
  1987. '
  1988. 28100 CALL ALLCAPS (LOCK.FILE.NAME$)
  1989.       LOCK.DRIVE = ASC(LEFT$(LOCK.FILE.NAME$,1))-ASC("A")
  1990.       LOCK.FILE.NAME$ = LOCK.FILE.NAME$ + _
  1991.                         STRING$(32-LEN(LOCK.FILE.NAME$),0)
  1992.       A = 0
  1993.       RETURN
  1994. '
  1995. ' *****************************************************************************
  1996. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$                           *
  1997. ' *****************************************************************************
  1998. '
  1999. 29000 MID$(LOCK.STATUS$,10,2) = "LD"
  2000.       SUBROUTINE.PARAMETER = 2
  2001.       CALL LINE25
  2002.       LOCK.FILE.NAME$ = EN$
  2003.       ON NETWORK.TYPE GOTO 29100,29010,22300,22400,22500
  2004. 29010 RETURN
  2005. '
  2006. ' *****************************************************************************
  2007. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (MULTI-LINK)              *
  2008. ' *****************************************************************************
  2009. '
  2010. 29100 AX = &H0
  2011.       BX = &H3
  2012.       CALL RBBSML(AX,BX)
  2013.       RETURN
  2014. '
  2015. ' *****************************************************************************
  2016. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$                         *
  2017. ' *****************************************************************************
  2018. '
  2019. 29500 MID$(LOCK.STATUS$,10,2) = "UD"
  2020.       SUBROUTINE.PARAMETER = 2
  2021.       CALL LINE25
  2022.       LOCK.FILE.NAME$ = EN$
  2023.       ON NETWORK.TYPE GOTO 29600,29510,25300,25400,25500
  2024. 29510 RETURN
  2025. '
  2026. ' *****************************************************************************
  2027. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (MULTI-LINK)            *
  2028. ' *****************************************************************************
  2029. '
  2030. 29600 AX = &H100
  2031.       BX = &H3
  2032.       CALL RBBSML(AX,BX)
  2033.       EXIT SUB
  2034.       END SUB
  2035. ' $SUBTITLE: 'OPENMSG - open the MESSAGES file'
  2036. ' $PAGE
  2037. '
  2038. '  SUBROUTINE NAME    -- OPENMSG
  2039. '
  2040. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2041. '                         ACTIVE.MESSAGE.FILE$
  2042. '                         SHARE.IT
  2043. '
  2044. '  OUTPUT PARAMETERS  --  MESSAGE.RECORD$
  2045. '
  2046.       SUB OPENMSG STATIC
  2047. '
  2048. ' *****************************************************************************
  2049. ' *  OPEN AND DEFINE MESSAGE FILE                                             *
  2050. ' *****************************************************************************
  2051. '
  2052. 30500 CLOSE 1
  2053.       IF SHARE.IT THEN _
  2054.          OPEN ACTIVE.MESSAGE.FILE$ FOR RANDOM SHARED AS #1 _
  2055.       ELSE OPEN "R",1,ACTIVE.MESSAGE.FILE$
  2056.       FIELD 1,128 AS MESSAGE.RECORD$
  2057.       END SUB
  2058. ' $SUBTITLE: 'TIMEREMAIN - calculates time remaining in a session'
  2059. ' $PAGE
  2060. '
  2061. '  SUBROUTINE NAME    -- TIMEREMAIN
  2062. '
  2063. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2064. '                         USER.LOGON.TIME!
  2065. '                         SECONDS.PER.SESSION!
  2066. '                         BYPASS.TIME.CHECK
  2067. '  OUTPUT PARAMETERS  --     PARAMETER                    MEANING
  2068. '                         TIME.REMAINING! TIME IN MINUTES LEFT IN SESSION
  2069. '                         TCA!            TIME USED IN SECONDS
  2070.       SUB TIMEREMAIN (TIME.REMAINING!) STATIC
  2071. 41010 TOA! = FRE("A")
  2072.       IF BYPASS.TIME.CHECK THEN _
  2073.          TIME.REMAINING! = SECONDS.PER.SESSION! : _
  2074.          EXIT SUB
  2075.       CALL FINDTIME (TI!)
  2076.       IF TI! > USER.LOGON.TIME! THEN _
  2077.          CALL FINDTIME (TCA!) : _
  2078.          TCA! = TCA! - USER.LOGON.TIME! _
  2079.       ELSE CALL FINDTIME (TI!) : _
  2080.            TCA! = TI! + 86400! - USER.LOGON.TIME!
  2081.       TIME.REMAINING! = (SECONDS.PER.SESSION!-TCA!) / 60
  2082.       TIME.REMAINING! = -(TIME.REMAINING! > 0.0)*TIME.REMAINING!
  2083.       END SUB
  2084. '
  2085. ' *****************************************************************************
  2086. ' * SUBROUTINE TO CALCULATE AND DISPLAY THE TIME REAMINING                    *
  2087. ' *****************************************************************************
  2088. '
  2089.       SUB DISPLAYTR (TIME.REMAINING!) STATIC
  2090.       CALL TIMEREMAIN (TIME.REMAINING!)
  2091.       CALL QTPUT (STR$(INT(TIME.REMAINING!))+" min left",1)
  2092.       END SUB
  2093. ' $SUBTITLE: 'AMORPM - subroutine to give time of day in AM/PM format'
  2094. ' $PAGE
  2095. '
  2096. '  SUBROUTINE NAME    -- AMORPM
  2097. '
  2098. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2099. '                        SUBROUTINE.PARAMETER = 1  GET CURRENT TIME AND DATE
  2100. '                        SUBROUTINE.PARAMETER = 2  CALCULATE TIME AS AM OR PM
  2101. '
  2102. '  OUTPUT PARAMETERS  -- CURRENT.DATE$           CURRENT DATE (MM-DD-YY)
  2103. '                        TIM$                    CURRENT TIME (I.E. 1:13 PM)
  2104. '                        TIME.LOGGEND.ON$        TIME USER LOGGED ON (HH:MM:SS)
  2105. '
  2106. '  SUBROUTINE PURPOSE -- TO SET THE OUTPUT PARAMETERS AS INDICATED AND
  2107. '                        DESCRIBE THE TIME AS "AM" OR "PM."
  2108. '
  2109.       SUB AMORPM STATIC
  2110.       ON SUBROUTINE.PARAMETER GOTO 41500,41510
  2111. '
  2112. ' *****************************************************************************
  2113. ' *  CALCULATE CURRENT TIME FOR AM OR PM                                      *
  2114. ' *****************************************************************************
  2115. '
  2116. 41500 TIME.LOGGED.ON$ = TIME$
  2117.       CURRENT.DATE$ = LEFT$(DATE$ ,6) + RIGHT$(DATE$ ,2)
  2118. 41510 TIM$ = TIME$
  2119.       IF VAL(MID$(TIM$,1,2)) = 12 THEN _
  2120.          MID$(TIM$,1,2) = RIGHT$(STR$(VAL(MID$(TIM$,1,2))),2) : _
  2121.          TIM$ = LEFT$(TIM$,5) + " PM" : _
  2122.          EXIT SUB
  2123.       IF VAL(MID$(TIM$,1,2)) > 11 THEN _
  2124.          MID$(TIM$,1,2) = RIGHT$(STR$(VAL(MID$(TIM$,1,2))-12),2) : _
  2125.          TIM$ = LEFT$(TIM$,5) + " PM" : _
  2126.          EXIT SUB
  2127.       TIM$ = LEFT$(TIM$,5) + " AM"
  2128.       END SUB
  2129. ' $SUBTITLE: 'CARRIER - subroutine to monitor carrier on comm. port'
  2130. ' $PAGE
  2131. '
  2132. '  SUBROUTINE NAME    -- CARRIER
  2133. '
  2134. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2135. '                         LOCAL.USER = 0               REMOTE USER
  2136. '                         LOCAL.USER = -1              LOCAL KEYBOARD USER
  2137. '                         MODEM.STATUS.REGISTER        ADDRESS OF THE COMMUNI-
  2138. '                                                      CATIONS PORT'S REGISTER
  2139. '                         SUBROUTINE.PARAMETER = -9    DON'T WRITE TO CALLERS
  2140. '                         SUBROUTINE.PARAMETER = -10   SAME AS -9, BUT DON'T
  2141. '                                                      DELAY
  2142. '
  2143. '  OUTPUT PARAMETERS  --  SUBROUTINE.PARAMETER = 0     CARRIER STILL PRESENT
  2144. '                         SUBROUTINE.PARAMETER = -1    CARRIER NOT PRESENT
  2145. '
  2146. '  SUBROUTINE PURPOSE --  TO TEST IF CARRIER IS PRESENT (I.E. THE USER
  2147. '                         STILL ON LINE).
  2148. '
  2149.       SUB CARRIER STATIC
  2150.       TOA! = FRE("A")
  2151.       IF SUBROUTINE.PARAMETER = -1 THEN _
  2152.          EXIT SUB
  2153.       SPEEDY = 0
  2154.       IF SUBROUTINE.PARAMETER <= -9 THEN _
  2155.      DONT.WRITE = -9
  2156.       IF SUBROUTINE.PARAMETER = -10 THEN _
  2157.      SPEEDY = -1
  2158.       SUBROUTINE.PARAMETER = 0
  2159. '
  2160. ' *****************************************************************************
  2161. ' * TEST FOR CARRIER PRESENT (DROP CALLER IF CARRIER NOT PRESENT)             *
  2162. ' *****************************************************************************
  2163. '
  2164. 42000 IF LOCAL.USER THEN _
  2165.          EXIT SUB
  2166. 42010 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2167.          EXIT SUB
  2168. '
  2169. ' *****************************************************************************
  2170. ' * IN CASE USER IS 2400 BAUD, PAUSE A SECOND AND CHECK AGAIN FOR CARRIER     *
  2171. ' * DETECT.  SOME 2400 BAUD MODEMS TAKE A WHILE TO SYNCHRONIZE THE CARRIER,   *
  2172. ' * HENCE A THREE-SECOND PAUSE BEFORE CHECKING AGAIN.                         *
  2173. ' *****************************************************************************
  2174. '
  2175.       IF SPEEDY = -1 THEN _
  2176.      GOTO 42020
  2177.       CALL DELAYIT (MODEM.INIT.WAIT.TIME)
  2178.       SUBROUTINE.PARAMETER = 0
  2179.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2180.          EXIT SUB
  2181. 42020 SUBROUTINE.PARAMETER = -1
  2182.       IF DONT.WRITE = -9 THEN _
  2183.      DONT.WRITE = 0 : _
  2184.          EXIT SUB
  2185.       IF ALREADY.WRITTEN = -9 THEN _
  2186.          EXIT SUB
  2187.       CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  2188.       ALREADY.WRITTEN = -9
  2189.       CALL UPDTCALR ("Carrier dropped",1)
  2190.       SUBROUTINE.PARAMETER = -1
  2191.       END SUB
  2192. '
  2193. ' $SUBTITLE: 'GRAPHIC - subroutine to find graphic version of a file'
  2194. ' $PAGE
  2195. '
  2196. '  SUBROUTINE NAME    -- GRAPHIC
  2197. '
  2198. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2199. '                            DEFAULT$          Users graphic default
  2200. '                            GR                Whether graphics avail
  2201. '                            FILE.NAME$        File to check
  2202. '
  2203. '  OUTPUT PARAMETERS  --     FILE.NAME$        Substitutes name of graphics
  2204. '                                              file if it exists
  2205. '
  2206. '  SUBROUTINE PURPOSE -- Checks whether there is a graphics version of
  2207. '                        a file, based on users graphics preference.
  2208. '                        Sets file name to graphics file if it exists,
  2209. '                        otherwise leaves file name intact.  Returns file
  2210. '                        name to use.
  2211. '
  2212.       SUB GRAPHIC (DEFAULT$) STATIC
  2213. 43031 IF GR THEN _
  2214.          CALL BRKFNAME (FILE.NAME$,DR$,X$,EXTENTION$,TRUE) : _
  2215.          IF LEN(X$) < 8 THEN _
  2216.             DF$ = DR$ + _
  2217.                   X$ + _
  2218.                   DEFAULT$ + _
  2219.                   EXTENTION$ : _
  2220.              CALL FINDIT (DF$): _
  2221.              IF OK THEN _
  2222.                 FILE.NAME$ = DF$
  2223.       END SUB
  2224. ' $SUBTITLE: 'SAVEPROF - subroutine to read a user profile'
  2225. ' $PAGE
  2226. '
  2227. '  SUBROUTINE NAME    -- SAVEPROF
  2228. '
  2229. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2230. '                        BPS
  2231. '                        EIGHT.BIT
  2232. '                        EXIT.TO.DOORS
  2233. '                        GR
  2234. '                        KERMIT.FUNCTION
  2235. '                        MESSAGE.RECORD$
  2236. '                        NODE.RECORD.INDEX
  2237. '                        SYSOP
  2238. '                        UPPER.CASE
  2239. '                        TIME.LOGGED.ON$
  2240. '                        PRIVATE.DOOR
  2241. '                        RELIABLE.MODE
  2242. '
  2243. '  OUTPUT PARAMETERS  -- NONE
  2244. '
  2245. '  SUBROUTINE PURPOSE -- SAVES A USER'S OPTIONS AND COMMUNICATIONS PARAMETERS
  2246. '                        IN THE NODE RECORD WHEN A USER EXITS TO A "DOOR" SO
  2247. '                        THAT HE IS IN THE SAME STATUS AS WHEN HE EXITED.
  2248. '
  2249.       SUB SAVEPROF(IPARM) STATIC
  2250.       ON IPARM GOTO 43070,43080
  2251. '
  2252. ' *****************************************************************************
  2253. ' *  SAVE USER PROFILE WHEN EXITING                                           *
  2254. ' *****************************************************************************
  2255. '
  2256. 43070 SUBROUTINE.PARAMETER = 3
  2257.       CALL FILELOCK
  2258.       CALL OPENMSG
  2259.       FIELD 1, 128 AS MESSAGE.RECORD$
  2260.       GET 1,NODE.RECORD.INDEX
  2261.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  2262.       MID$(MESSAGE.RECORD$,42,2) = STR$(EIGHT.BIT)
  2263.       MID$(MESSAGE.RECORD$,44,2) = STR$(BPS)
  2264.       MID$(MESSAGE.RECORD$,46,2) = STR$(UPPER.CASE)
  2265.       MID$(MESSAGE.RECORD$,48,5) = SPACE$(5)
  2266.       MID$(MESSAGE.RECORD$,53,2) = STR$(GR)
  2267.       MID$(MESSAGE.RECORD$,55,2) = STR$(SYSOP)
  2268.       MID$(MESSAGE.RECORD$,64,8) = TIME.LOGGED.ON$
  2269.       MID$(MESSAGE.RECORD$,72,2) = STR$(PRIVATE.DOOR)
  2270.       MID$(MESSAGE.RECORD$,74,2) = STR$(TRANSFER.FUNCTION)
  2271.       MID$(MESSAGE.RECORD$,91,2) = STR$(RELIABLE.MODE)
  2272. 43080 PUT 1,NODE.RECORD.INDEX
  2273.       SUBROUTINE.PARAMETER = 2
  2274.       CALL FILELOCK
  2275.       CALL OPENMSG
  2276.       END SUB
  2277. ' $SUBTITLE: 'READPROF - subroutine to restore a user profile'
  2278. ' $PAGE
  2279. '
  2280. '  SUBROUTINE NAME    -- READPROF
  2281. '
  2282. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2283. '                        NODE.RECORD.INDEX     NODE RECORD TO USE
  2284. '                        SYSOP.PASSWORD.1$     SYSOP'S PSEUDONYM 1
  2285. '                        SYSOP.PASSWORD.2$     SYSOP'S PSEUDONYM 2
  2286. '
  2287. '  OUTPUT PARAMETERS  -- USER'S OPTIONS AND COMMUNICATIONS PARAMETERS
  2288. '                        UPON EXITING RBBS-PC TO A "DOOR"
  2289. '
  2290. '  SUBROUTINE PURPOSE -- RESET A USER'S OPTIONS AND COMMUNICATIONS PARAMETERS
  2291. '                        THAT WERE SAVED IN THE NODE RECORD WHEN A USER EXITED
  2292. '                        TO A "DOOR" SO THAT HE IS IN THE SAME STATUS AS WHEN
  2293. '                        HE EXITED.
  2294. '
  2295.       SUB READPROF STATIC
  2296. '
  2297. ' *****************************************************************************
  2298. ' *  RESTORE USER PROFILE WHEN RETURNING FROM DOORS                           *
  2299. ' *****************************************************************************
  2300. '
  2301. 44000 LOCATE 24,1
  2302.       PRINT "NODE INDEX", NODE.RECORD.INDEX
  2303.       FIELD 1, 128 AS MESSAGE.RECORD$
  2304.       GET 1,NODE.RECORD.INDEX
  2305.       EIGHT.BIT = VAL(MID$(MESSAGE.RECORD$,42,2))
  2306.       RELIABLE.MODE = VAL(MID$(MESSAGE.RECORD$,91,2))
  2307.       BPS = VAL(MID$(MESSAGE.RECORD$,44,2))
  2308.       CALL COMMINFO
  2309.       BAUD.TEST = VAL(LEFT$(BAUD.PARITY$,4))
  2310.       UPPER.CASE = VAL(MID$(MESSAGE.RECORD$,46,2))
  2311.       GR = VAL(MID$(MESSAGE.RECORD$,53,2))
  2312.       SYSOP = VAL(MID$(MESSAGE.RECORD$,55,2))
  2313.       TIME.LOGGED.ON$ = MID$(MESSAGE.RECORD$,64,8)
  2314.       PRIVATE.DOOR = VAL(MID$(MESSAGE.RECORD$,72,2))
  2315.       TRANSFER.FUNCTION = VAL(MID$(MESSAGE.RECORD$,74,2))
  2316.       IF REQUIRED.RINGS > 0 AND _
  2317.          INSTR(MODEM.INIT.COMMAND$,"S0=255") THEN _
  2318.          COLOR 7,0,0 _
  2319.       ELSE COLOR FG,BG,BORDER
  2320.       IF LOCAL.USER.MODE THEN _
  2321.          GOTO 44003
  2322.       IF BPS = -1 THEN _
  2323.          BAUD.RATE.DIVISOR = &H180 + (11*(COMPUTER.TYPE = 2))
  2324.       IF BPS = -2 THEN _
  2325.          BAUD.RATE.DIVISOR = &H100 + (8*(COMPUTER.TYPE = 2))
  2326.       IF BPS = -3 THEN _
  2327.          BAUD.RATE.DIVISOR = &H60 + (3*(COMPUTER.TYPE = 2))
  2328.       IF BPS = -4 THEN _
  2329.          BAUD.RATE.DIVISOR = &H30 + (1*(COMPUTER.TYPE = 2))
  2330.       IF BPS = -5 THEN _
  2331.          BAUD.RATE.DIVISOR = &H18
  2332.       IF BPS = -6 THEN _
  2333.          BAUD.RATE.DIVISOR = &HC
  2334.       CALL SETBAUD
  2335. 44003 CALL FINDTIME (USER.LOGON.TIME!)
  2336.       IF MINUTES.PER.SESSION! < 1 THEN _
  2337.          MINUTES.PER.SESSION! = 3
  2338.       IF NOT EIGHT.BIT THEN _
  2339.          OUT LINE.CONTROL.REGISTER,&H1A
  2340.       IF SYSOP THEN _
  2341.          FIRST.NAME$ = SYSOP.PASSWORD.1$ : _
  2342.          LAST.NAME$ = SYSOP.PASSWORD.2$ : _
  2343.          ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + _
  2344.                              " " + LAST.NAME$,1,31) : _
  2345.          EXIT SUB
  2346.       FIRST.NAME.END = INSTR(MESSAGE.RECORD$," ")
  2347.       LAST.NAME.END = INSTR(FIRST.NAME.END + 1,MESSAGE.RECORD$+" ","  ") 'CPC151B6
  2348.       FIRST.NAME$ = LEFT$(MESSAGE.RECORD$,FIRST.NAME.END-1)
  2349.       LAST.NAME$ = MID$(MESSAGE.RECORD$,FIRST.NAME.END + 1,LAST.NAME.END-(FIRST.NAME.END + 1))
  2350.       ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  2351.       Z$ = FIRST.NAME$
  2352.       END SUB
  2353. ' $SUBTITLE: 'COMMINFO - subroutine for variable of users baud/parity'
  2354. ' $PAGE
  2355. '
  2356. '  SUBROUTINE NAME    -- COMMINFO
  2357. '
  2358. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2359. '                              BPS               BAUD RATE INDICATOR
  2360. '                            EIGHT.BIT           INDICATE FOR N/8/1
  2361. '
  2362. '  OUTPUT PARAMETERS  -- BAUD.PARITY$
  2363. '
  2364. '  SUBROUTINE PURPOSE -- CREATE A STRING THAT SHOWS A USERS BAUD RATE AND
  2365. '                        PARITY.
  2366. '
  2367.       SUB COMMINFO STATIC
  2368. '
  2369. ' *****************************************************************************
  2370. ' *  DETERMINE BAUD AND PARITY                                                *
  2371. ' *****************************************************************************
  2372. '
  2373.   IF RELIABLE.MODE THEN _
  2374.      RELIABLE.MODE$ = "-R," _
  2375.   ELSE RELIABLE.MODE$ = ","
  2376.   BAUD.PARITY$ = MID$("    300 4501200240048009600",(-4*BPS),4) + _
  2377.                  " BAUD" + _
  2378.                  RELIABLE.MODE$ + _
  2379.                  MID$("N,8,1E,7,1",6 + 5*EIGHT.BIT,5)
  2380.   END SUB
  2381. ' $SUBTITLE: 'DELAYIT - subroutine to wait number of seconds specified'
  2382. ' $PAGE
  2383. '
  2384. '  SUBROUTINE NAME    -- DELAYIT
  2385. '
  2386. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2387. '                             DELAY.TIME           NUMBER OF SECONDS TO DELAY
  2388. '                                                  (0 TO 3,600)
  2389. '
  2390. '  OUTPUT PARAMETERS  -- NONE
  2391. '
  2392. '  SUBROUTINE PURPOSE -- TO WAIT THE NUMBER OF SECONDS INDICATED BEFORE
  2393. '                        RETURNING CONTROL TO THE CALLING ROUTINE.
  2394. '
  2395.       SUB DELAYIT (DELAY.TIME) STATIC
  2396.       IF DELAY.TIME < 1 THEN _
  2397.          EXIT SUB
  2398.       CALL FINDTIME (DELAY!)
  2399.       DELAY! = DELAY.TIME + DELAY!
  2400.       IF DELAY! < 86400! THEN _
  2401.          GOTO 50520
  2402. 50500 CALL FINDTIME (TI!)
  2403.       IF TI! > DELAY.TIME THEN _  ' IF SECONDS TO DELAY IS PAST
  2404.          GOTO 50500              ' MIDNIGHT WAIT FOR THE CLOCK TO WRAP AROUND
  2405.       DELAY! = DELAY! - 86400!   ' TO PAST MIDNIGHT AND ADJUST THE DELAY
  2406. 50520 CALL FINDTIME (TI!)
  2407.       IF TI! < DELAY! THEN _
  2408.          GOTO 50520
  2409.       END SUB
  2410. ' $SUBTITLE: 'MODEMPUT - subroutine to write modem commands to modem'
  2411. ' $PAGE
  2412. '
  2413. '  SUBROUTINE NAME    -- MODEMPUT
  2414. '
  2415. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  2416. '                        STRNG$                    MODEM COMMAND
  2417. '                        COMMANDS.BETWEEN.RINGS    INDICATOR TO WAIT FOR
  2418. '                                                  MODEM TO STOP RINGING
  2419. '                                                  BEFORE ISSUING COMMANDS
  2420. '                        DUMB.MODEM                INDICATOR THAT MODEM WOULD
  2421. '                                                  NOT UNDERSTAND COMMANDS
  2422. '
  2423. '  OUTPUT PARAMETERS  -- NONE
  2424. '
  2425. '  SUBROUTINE PURPOSE -- TO ISSUE MODEM COMMANDS TO THE MODEM
  2426. '
  2427.       SUB MODEMPUT (STRNG$) STATIC
  2428. '
  2429. ' *****************************************************************************
  2430. ' *  SEND MODEM COMMAND                                                       *
  2431. ' *****************************************************************************
  2432. '
  2433. 52070 IF DUMB.MODEM THEN _
  2434.          EXIT SUB
  2435.       IF NOT COMMANDS.BETWEEN.RINGS OR _
  2436.      NOT (INP(MODEM.STATUS.REGISTER) AND &H40) THEN _
  2437.      GOTO 52080
  2438.       CALL FINDTIME (CONNECT.DELAY!)
  2439.       CONNECT.DELAY! = CONNECT.DELAY! + 7
  2440. 52072 IF (INP(MODEM.STATUS.REGISTER) AND &H40) > 0 THEN _
  2441.      CALL FINDTIME (TI!) : _
  2442.      IF TI! > CONNECT.DELAY! OR _
  2443.         (ABS(CONNECT.DELAY! - TI!) > 30 AND _
  2444.          (TI! + 86400 > CONNECT.DELAY!)) THEN _
  2445.         GOTO 52080
  2446.       GOTO 52072
  2447. 52080 CALL DELAYIT (MODEM.COMMAND.DELAY.TIME)
  2448.       PRINT #3,STRNG$
  2449.       END SUB
  2450. ' $SUBTITLE: 'FINDFUNC - subroutine to find if function key was pressed'
  2451. ' $PAGE
  2452. '
  2453. '  SUBROUTINE NAME    -- FINDFUNC
  2454. '
  2455. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2456. '                        F1.KEY           FUNCTION KEY ONE VALUE
  2457. '                        F10.KEY          FUNCTION KEY TEN VALUE
  2458. '
  2459. '  OUTPUT PARAMETERS  -- FUNCTION.KEY (VALUE 1 TO 10 CORRESPONDING TO
  2460. '                                      THE FUNCTION KEY THAT WAS PRESSED).
  2461. '                        KEY.PRESSED$ (CHARACTER STRING INPUTTED).
  2462. '
  2463. '  SUBROUTINE PURPOSE -- TO DETERMINE IF A FUNCTION HAS BEEN PRESSED ON
  2464. '                        THE PC'S KEYBOARD THAT IS RUNNING RBBS-PC.
  2465. '
  2466.       SUB FINDFUNC STATIC
  2467. '
  2468. ' *****************************************************************************
  2469. ' *  TEST FOR FUNCTION KEY PRESSED                                            *
  2470. ' *****************************************************************************
  2471. '
  2472. 58040 KEY.PRESSED$ = INKEY$
  2473.       FUNCTION.KEY = 0
  2474.       IF LEN(KEY.PRESSED$) <> 2 THEN _
  2475.          EXIT SUB
  2476.       KEY.PRESSED = ASC(RIGHT$(KEY.PRESSED$,1))
  2477.       IF LOCAL.USER.MODE THEN _
  2478.          KEY.PRESSED$ = "" : _
  2479.          EXIT SUB
  2480.       IF KEY.PRESSED >= F1.KEY AND _
  2481.          KEY.PRESSED <= F10.KEY THEN _
  2482.              FUNCTION.KEY = KEY.PRESSED - 58:_
  2483.              EXIT SUB
  2484.       IF KEY.PRESSED = 79 THEN _     'End
  2485.          FUNCTION.KEY = 11 : _
  2486.          EXIT SUB
  2487.       IF KEY.PRESSED = 72 THEN _     'up arrow
  2488.          CALL CARRIER : _
  2489.          IF SUBROUTINE.PARAMETER = -1 THEN _
  2490.             EXIT SUB _
  2491.          ELSE ADJUSTED.SECURITY = TRUE : _
  2492.               USER.SECURITY.LEVEL = USER.SECURITY.LEVEL + 1: _
  2493.               SUBROUTINE.PARAMETER = 2: _
  2494.               CALL LINE25: _
  2495.               CALL CALLOPT : _
  2496.               EXIT SUB
  2497.       IF KEY.PRESSED = 73 THEN _     'PgUp
  2498.          FUNCTION.KEY = 12 : _
  2499.          EXIT SUB
  2500.       IF KEY.PRESSED = 80 THEN _     'Down arrow
  2501.          CALL CARRIER : _
  2502.          IF SUBROUTINE.PARAMETER = -1 THEN _
  2503.             EXIT SUB_
  2504.          ELSE ADJUSTED.SECURITY = TRUE:_
  2505.               USER.SECURITY.LEVEL = USER.SECURITY.LEVEL - 1: _
  2506.               SUBROUTINE.PARAMETER = 2: _
  2507.               CALL LINE25: _
  2508.               CALL CALLOPT : _
  2509.               EXIT SUB
  2510.       END SUB
  2511. ' $SUBTITLE: 'FINDTIME - subroutine to calculate seconds since midnight'
  2512. ' $PAGE
  2513. '
  2514. '  SUBROUTINE NAME    -- FINDTIME
  2515. '
  2516. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2517. '                            SECONDS!          VARIABLE TO RETURN RESULTS WITH
  2518. '
  2519. '  OUTPUT PARAMETERS  --     SECONDS!          SECONDS SINCE MIDNIGHT
  2520. '
  2521. '  SUBROUTINE PURPOSE -- TO CALCULATE THE NUMBER OF SECONDS THAT HAVE
  2522. '                        ELASPED SINCE MIDNIGHT
  2523. '
  2524.       SUB FINDTIME (SECONDS!) STATIC
  2525. 58050 SECONDS! = TIMER
  2526.       END SUB
  2527. ' $SUBTITLE: 'ALLCAPS - subroutine to convert string to upper case'
  2528. ' $PAGE
  2529. '
  2530. '  SUBROUTINE NAME    -- ALLCAPS
  2531. '
  2532. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2533. '                            CONVERT.FIELD$    STRING TO MAKE UPPER CASE
  2534. '
  2535. '  OUTPUT PARAMETERS  --     CONVERT.FIELD$    CONVERTED STRINGS
  2536. '
  2537. '  SUBROUTINE PURPOSE -- SUBROUTINE TO CONVERT A STRING TO UPPER CASE
  2538. '
  2539.       SUB ALLCAPS (CONVERT.FIELD$) STATIC
  2540. 58060 IF TURBO.RBBS THEN _
  2541.          CALL RBBSULC (CONVERT.FIELD$) : _
  2542.          EXIT SUB
  2543.       FOR Z = 1 TO LEN(CONVERT.FIELD$)
  2544.           IF MID$(CONVERT.FIELD$,Z,1) > "@" THEN _
  2545.              MID$(CONVERT.FIELD$,Z,1) = CHR$(ASC(MID$(CONVERT.FIELD$,Z,1)) AND 223)
  2546.       NEXT
  2547.       END SUB
  2548. ' $SUBTITLE: 'ALLCAPSD - subroutine to convert string to upper case'
  2549. ' $PAGE
  2550. '
  2551. '  SUBROUTINE NAME    -- ALLCAPSD
  2552. '
  2553. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2554. '                            CONVERT.FIELD$    DIMENSIONED STRING TO MAKE
  2555. '                                              UPPER CASE
  2556. '
  2557. '  OUTPUT PARAMETERS  --     CONVERT.FIELD$    CONVERTED STRINGS
  2558. '
  2559. '  SUBROUTINE PURPOSE -- SUBROUTINE TO CONVERT A STRING TO UPPER CASE
  2560. '
  2561.       SUB ALLCAPSD (CONVERT.FIELD$(1),CONVERT.INDEX) STATIC
  2562. 58065 IF TURBO.RBBS THEN _
  2563.          CALL RBBSULC (CONVERT.FIELD$(CONVERT.INDEX)) : _
  2564.          EXIT SUB
  2565.       FOR Z = 1 TO LEN(CONVERT.FIELD$(CONVERT.INDEX))
  2566.           IF MID$(CONVERT.FIELD$(CONVERT.INDEX),Z,1) > "@" THEN _
  2567.              MID$(CONVERT.FIELD$(CONVERT.INDEX),Z,1) = CHR$(ASC(MID$(CONVERT.FIELD$(CONVERT.INDEX),Z,1)) AND 223)
  2568.       NEXT
  2569.       END SUB
  2570. ' $SUBTITLE: 'CHECKTIM - subroutine to see if time has elasped'
  2571. ' $PAGE
  2572. '
  2573. '  SUBROUTINE NAME    -- CHECKTIM
  2574. '
  2575. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2576. '                            MAX.TIME!         NUMBER OF SECONDS PAST MIDNIGHT
  2577. '                                              NOT TO EXCEED
  2578. '
  2579. '  OUTPUT PARAMETERS  -- SUBROUTINE.PARAMETER = 1 CURRENT TIME IS LESS THAN
  2580. '                                                 MAX.TIME!
  2581. '                        SUBROUTINE.PARAMETER = 2 CURRENT TIME IS GREATER THAN
  2582. '                                                 OR EQUAL TO MAX.TIME!
  2583. '
  2584. '  SUBROUTINE PURPOSE -- SUBROUTINE TO CHECK IF THE CURRENT TIME IS GREATER
  2585. '                        THAN OR EQUAL TO THE TIME ALLOWED
  2586. '
  2587.       SUB CHECKTIM (MAX.TIME!) STATIC
  2588. 58070 SUBROUTINE.PARAMETER = 1
  2589.       CALL FINDTIME (TI!)
  2590.       IF MAX.TIME! < 86400 AND TI! < MAX.TIME! THEN _
  2591.          EXIT SUB
  2592.       IF MAX.TIME! < 86400 AND TI! => MAX.TIME! THEN _
  2593.          SUBROUTINE.PARAMETER = 2 : _
  2594.          EXIT SUB
  2595.       TEST.TIME! = MAX.TIME! - 86400
  2596.       IF TEST.TIME! - TI! <= 0 THEN _
  2597.          EXIT SUB
  2598.       IF TI! => TEST.TIME! THEN _
  2599.          SUBROUTINE.PARAMETER = 2
  2600.       END SUB
  2601. ' $SUBTITLE: 'HASHRBBS - subroutine to determine where to look for user'
  2602. ' $PAGE
  2603. '
  2604. '  SUBROUTINE NAME    -- HASHRBBS
  2605. '
  2606. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2607. '                            STRNG.TO.HASH$    USER NAME TO LOCATE
  2608. '                            MAX.POSITION      MAXIMUM # USERS
  2609. '
  2610. '  OUTPUT PARAMETERS  --     PRIME.HASH        WHERE TO LOOK FIRST
  2611. '                            SECOND.HASH       LOOK THIS FAR AHEAD
  2612. '
  2613. '  SUBROUTINE PURPOSE -- WHERE TO LOOK FOR A USER IN USERS FILE
  2614. '                        LOOK FIRST AT PRIME POSITION, THEN ADD
  2615. '                        SECOND.HASH UNTIL FIND OR FIND UNUSED RECORD
  2616. '
  2617.       SUB HASHRBBS (STRNG.TO.HASH$,MAX.POSITION,PRIME.HASH,SECOND.HASH) STATIC
  2618. 58080 SECOND.HASH = (ASC(MID$(STRNG.TO.HASH$,2,1))*10  + 7) MOD _
  2619.            MAX.POSITION
  2620.       PRIME.HASH = _
  2621.            ((ASC(STRNG.TO.HASH$)*100  + _
  2622.              ASC(MID$(STRNG.TO.HASH$,LEN(STRNG.TO.HASH$) / 2,1)) * _
  2623.              10  + _
  2624.              ASC(RIGHT$(STRNG.TO.HASH$,1))) _
  2625.              MOD MAX.POSITION) + 1
  2626.       END SUB
  2627. ' $SUBTITLE: 'CALLOPT - subroutine to set prompts based on user security'
  2628. ' $PAGE
  2629. '
  2630. '  SUBROUTINE NAME    -- CALLOPT
  2631. '
  2632. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2633. '                            BEG.MAIN          POSITION START OF MAIN CMDS
  2634. '                            BEG.FILE          POSITION START OF FILE CMDS
  2635. '                            BEG.UTIL          POSITION START OF UTIL CMDS
  2636. '
  2637. '  OUTPUT PARAMETERS  -- PRESENT.OPTS$         DISPLAY WHAT USER CAN DO (1st)
  2638. '                        CALLERS.OPTS$         DISPLAY WHAT USER CAN DO (2nd)
  2639. '                        MAIN.OPTS$            MAIN OPTS USER CAN DO
  2640. '                        FILE.OPTS$            FILE OPTS USER CAN DO
  2641. '                        UTIL.OPTS$            UTIL OPTS USER CAN DO
  2642. '
  2643. '  SUBROUTINE PURPOSE -- SETS COMMAND LINE DISPLAY OF WHAT USER CAN DO BY
  2644. '                        SECTION AND DISPLAY OF WHAT ALL USER CAN DO
  2645. '
  2646.       SUB CALLOPT STATIC
  2647. 58090 FIRST = BEG.MAIN
  2648.       LAST = BEG.FILE - 1
  2649.       CALL SETOPTS (MAIN.OPTS$,FIRST,LAST)
  2650.       FIRST = BEG.FILE
  2651.       LAST = BEG.UTIL - 1
  2652.       CALL SETOPTS (FILE.OPTS$,FIRST,LAST)
  2653.       FIRST = BEG.UTIL
  2654.       LAST = BEG.UTIL + 10
  2655.       CALL SETOPTS (UTIL.OPTS$,FIRST,LAST)
  2656.       FIRST = 40
  2657.       LAST = 46
  2658.       CALL SETOPTS (SYS.OPTS$,FIRST,LAST)
  2659.       FIRST = 36
  2660.       LAST = 39
  2661.       CALL SETOPTS (GLOBAL.OPTS$,FIRST,LAST)
  2662.       PRESENT.OPTS$ = "Your valid commands are:"
  2663.       IF LEN(GLOBAL.OPTS$) > 0 THEN _
  2664.           PRESENT.OPTS$ = PRESENT.OPTS$ + " Globals: " + GLOBAL.OPTS$
  2665.       CALLERS.OPTS$ = "Main: " + MAIN.OPTS$ + _
  2666.                       " File: " + FILE.OPTS$ + _
  2667.                       " Util: " + UTIL.OPTS$
  2668.       IF LEN(SYS.OPTS$)>0 THEN _
  2669.          CALLERS.OPTS$ = CALLERS.OPTS$ + " Sysop: " + SYS.OPTS$
  2670.       MAIN.OPTS$ = GLOBAL.OPTS$ + MAIN.OPTS$
  2671.       FILE.OPTS$ = GLOBAL.OPTS$ + FILE.OPTS$
  2672.       UTIL.OPTS$ = GLOBAL.OPTS$ + UTIL.OPTS$
  2673.       CALL SRTSTRNG (SYS.OPTS$)
  2674.       CALL SRTSTRNG (MAIN.OPTS$)
  2675.       MAIN.OPTS$ = MAIN.OPTS$ + SYS.OPTS$
  2676.       CALL SRTSTRNG (FILE.OPTS$)
  2677.       CALL SRTSTRNG (UTIL.OPTS$)
  2678.       CALL INSCOMMA (MAIN.OPTS$)
  2679.       CALL INSCOMMA (FILE.OPTS$)
  2680.       CALL INSCOMMA (UTIL.OPTS$)
  2681.       DIR.PROMPT$ = "What directories (" + _
  2682.                     MID$("<U>pload,<A>ll,[ENTER] ", _
  2683.                     9*(USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW)+10)
  2684.       END SUB
  2685. ' $SUBTITLE: 'SETOPTS - subroutine to set prompts based on user security'
  2686. ' $PAGE
  2687. '
  2688. '  SUBROUTINE NAME    -- SETOPTS
  2689. '
  2690. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2691. '                            FIRST             POSITION WHERE START LOOKING
  2692. '                            LAST              POSITION WHERE QUIT LOOKING
  2693. '                            USER.SECURITY.LEVEL SECURITY OF USER
  2694. '
  2695. '  OUTPUT PARAMETERS  -- OPTIONS$              LIST OF COMMANDS USER CAN DO
  2696. '
  2697. '  SUBROUTINE PURPOSE -- STRING TOGETHER WHAT COMMANDS USER CAN DO
  2698. '                        IN A SECTION
  2699. '
  2700.       SUB SETOPTS (OPTIONS$,FIRST,LAST) STATIC
  2701. 58100 OPTIONS$ = ""
  2702.       FOR I = FIRST TO LAST
  2703.          IF USER.SECURITY.LEVEL >= OPT.SEC(I) THEN _
  2704.             IF MID$(ALL.OPTS$,I,1) <> " " THEN _
  2705.                OPTIONS$ = OPTIONS$ + MID$(ALL.OPTS$,I,1)
  2706.       NEXT
  2707.       CALL SRTSTRNG (OPTIONS$)
  2708.       END SUB
  2709. ' $SUBTITLE: 'CHKNEWBUL - subroutine to check whether got new bulletins'
  2710. ' $PAGE
  2711. '
  2712. '  SUBROUTINE NAME    -- CHKNEWBUL
  2713. '
  2714. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2715. '                            LAST.ON$          Last date of logon
  2716. '                                                format mm/dd/yy
  2717. '                            ACTIVE.BULLETINS  # of bulletins
  2718. '                            BULLETIN.PREFIX$  Filespec for bulletins
  2719. '
  2720. '  OUTPUT PARAMETERS  --     NUM.NEW.BULLETS   Number of new bulletins
  2721. '                            NEW.BULLETS$      List of new bullet #'s
  2722. '                            Q                 where last bulletin stored
  2723. '                                                 in B$()
  2724. '                            B$()              Bulletins #'s that are new
  2725. '                                                 (2,3,4,...)
  2726. '  SUBROUTINE PURPOSE -- Checks how many bulletins have system date
  2727. '                        at or later than date caller last logged on
  2728. '
  2729.       SUB CHKNEWBUL (LAST.ON$,NUM.NEW.BULLETS,NEW.BULLETS$) STATIC
  2730. 58110 NUM.NEW.BULLETS = 0
  2731.       NEW.BULLETS$ = ":  "
  2732.       BASE.DATE# = VAL(MID$(LAST.ON$,4,2)) + (100 * VAL(MID$(LAST.ON$,1,2))) + _
  2733.                    (10000# * (1900 + VAL(MID$(LAST.ON$,7,2))))
  2734.       FOR I = 1 TO ACTIVE.BULLETINS
  2735.          Y$ = MID$(STR$(I),2)
  2736.          X$ = BULLETIN.PREFIX$ + Y$ + CHR$(0)
  2737.      CALL RBBSFIND (X$,IX,YY,MM,DD)
  2738.      IF IX = 0 THEN _
  2739.             FDATE# = DD + (100 * MM) + (10000# * (YY+1980)) : _
  2740.             IF BASE.DATE# <= FDATE# THEN _
  2741.                NUM.NEW.BULLETS = NUM.NEW.BULLETS + 1 : _
  2742.                B$(NUM.NEW.BULLETS+1) = Y$ : _
  2743.                NEW.BULLETS$ = NEW.BULLETS$ + " " + Y$
  2744.       NEXT
  2745.       Q = NUM.NEW.BULLETS+1
  2746.       IF NUM.NEW.BULLETS < 1 THEN _
  2747.          NEW.BULLETS$ = ""
  2748.       END SUB
  2749. ' $SUBTITLE: 'SRTSTRNG - subroutine to sort characters in a string'
  2750. ' $PAGE
  2751. '
  2752. '  SUBROUTINE NAME    -- SRTSTRNG
  2753. '
  2754. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2755. '                              STRNG$           String to sort
  2756. '
  2757. '  OUTPUT PARAMETERS  --     STRNG$             Sorted string
  2758. '
  2759. '  SUBROUTINE PURPOSE -- Sorts characters in passed string.
  2760. '
  2761.       SUB SRTSTRNG (STRNG$) STATIC
  2762. 58120 S0 = LEN(STRNG$)
  2763.       S1 = S0
  2764.       X$ = "!"
  2765. 58122 S1 = S1\2
  2766.       IF S1 = 0 THEN _
  2767.          EXIT SUB
  2768.       S2 = S0 - S1
  2769.       FOR S3 = 1 TO S2
  2770.          S4 = S3
  2771. 58124    S5 = S4 + S1
  2772.          IF MID$(STRNG$,S4,1) > MID$(STRNG$,S5,1) THEN _
  2773.             LSET X$ = MID$(STRNG$,S4,1):_
  2774.             MID$(STRNG$,S4,1) = MID$(STRNG$,S5,1):_
  2775.             MID$(STRNG$,S5,1) = X$: _
  2776.             S4 = S4 - S1:_
  2777.             IF S4 > 0 THEN _
  2778.                GOTO 58124
  2779.       NEXT
  2780.       GOTO 58122
  2781.       END SUB
  2782. ' $SUBTITLE: 'INSCOMMA - subroutine to format commands in command prompt'
  2783. ' $PAGE
  2784. '
  2785. '  SUBROUTINE NAME    -- INSCOMMA
  2786. '
  2787. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2788. '                              STRNG$           String to replace
  2789. '
  2790. '  OUTPUT PARAMETERS  --     STRNG$             Replaced string
  2791. '
  2792. '  SUBROUTINE PURPOSE -- Inserts commands between each letter in STRNG$
  2793. '                        and encloses in pointed brackets
  2794.       SUB INSCOMMA (STRNG$) STATIC
  2795. 58130 L = LEN(STRNG$)
  2796.       IF L < 1 THEN _
  2797.          EXIT SUB
  2798.       LSET LINEMES$ = " <" + LEFT$(STRNG$,1)
  2799.       FOR K = 2 TO L
  2800.          MID$(LINEMES$,2*K,2) = "," + MID$(STRNG$,K,1)
  2801.       NEXT
  2802.       STRNG$ = LEFT$(LINEMES$,2*L+1) + ">"
  2803.       END SUB
  2804. ' $SUBTITLE: 'LOADNEW - subroutine to get latest uploads'
  2805. ' $PAGE
  2806. '
  2807. '  SUBROUTINE NAME    -- LOADNEW
  2808. '
  2809. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2810. '                          UPLOAD.DIRECTORY$  List of files uploaded
  2811. '
  2812. '  OUTPUT PARAMETERS  --     A$                Latest uploads
  2813. '
  2814. '  SUBROUTINE PURPOSE -- Loads table of most recent number of uploads
  2815. '                        by date
  2816.       SUB LOADNEW (ARA(2)) STATIC
  2817. 58140 IF FMS.DIRECTORY$ = "" THEN _
  2818.          EXIT SUB
  2819.       CALL OPENFMS (LAST.REC)
  2820.       FIELD 2, 23 AS PRE.DATE$,_
  2821.                 2 AS MM$,_
  2822.                 1 AS FILL1$,_
  2823.                 2 AS DD$,_
  2824.                 1 AS FILL2$,_
  2825.                 2 AS YY$,_
  2826.                 (2+MAX.DESC.LEN) AS FILL3$,_
  2827.                 3 AS CATEGORY$, _
  2828.                 2 AS FILL4$
  2829.       MAX.RECS = UBOUND(ARA,1)
  2830.       IF MAX.RECS < 1 THEN_
  2831.          MAX.RECS = 1 _
  2832.       ELSE IF MAX.RECS > 23 THEN _
  2833.               MAX.RECS = 23
  2834.       L = 0
  2835.       K = LAST.REC
  2836.       WHILE K > 0 AND L < MAX.RECS
  2837.          GET #2,K
  2838.          IF (CAN.DOWNLOAD.FROM.UP OR CATEGORY$ <> DEFAULT.CATEGORY.CODE$) THEN _
  2839.             L = L+1:_
  2840.             ARA(L,1) = 366*(VAL(YY$)-80)+31*VAL(MM$)+VAL(DD$)
  2841.          IF NOT CAN.DOWNLOAD.FROM.UP THEN _
  2842.             X = MIN.SEC.TO.VIEW _
  2843.          ELSE IF CATEGORY$ = "***" THEN _
  2844.                  X = SYSOP.SECURITY.LEVEL _
  2845.               ELSE IF CATEGORY$ = DEFAULT.CATEGORY.CODE$ THEN _
  2846.                       X = MIN.SEC.TO.VIEW _
  2847.                    ELSE_
  2848.                        X = OPT.SEC(18)
  2849.          ARA(L,2) = X
  2850.          K = K - 1
  2851.       WEND
  2852.       CLOSE 2
  2853.       END SUB
  2854. ' $SUBTITLE: 'CTNEWFILES - subroutine to count how many files new'
  2855. ' $PAGE
  2856. '
  2857. '  SUBROUTINE NAME    -- CTNEWFILES
  2858. '
  2859. '  INPUT PARAMETERS   --     PARAMETER           MEANING
  2860. '                             LAST.ON$          Date of last logon
  2861. '                             UPLDS$            Latest uploads
  2862. '
  2863. '  OUTPUT PARAMETERS  --    NUM.NEW.FILES       How many after last logon
  2864. '
  2865. '  SUBROUTINE PURPOSE -- CHECKS HOW MANY FILES IN UPLDS$ WERE UPLOADED ON OR
  2866. '                        AFTER DATE OF LAST LOGON THAT THE USER CAN DOWNLOAD
  2867. '
  2868.       SUB CTNEWFILES (LAST.ON$,UPLDS(2),NUM.USER.FILES) STATIC
  2869. 58150 BASE.DATE = 366*(VAL(MID$(LAST.ON$,7,2))-80) + _
  2870.                   31*(VAL(MID$(LAST.ON$,1,2))) + _
  2871.                   VAL(MID$(LAST.ON$,4,2))
  2872.       NUM.NEW.FILES = 1
  2873.       NUM.USER.FILES = 0
  2874.       WHILE (BASE.DATE <= UPLDS(NUM.NEW.FILES,1) AND _
  2875.                 UPLDS(NUM.NEW.FILES,1)>0 AND_
  2876.                 NUM.NEW.FILES < UBOUND(UPLDS,1))
  2877.         IF USER.SECURITY.LEVEL >= UPLDS(NUM.NEW.FILES,2) THEN _
  2878.            NUM.USER.FILES = NUM.USER.FILES + 1
  2879.         NUM.NEW.FILES = NUM.NEW.FILES + 1
  2880.       WEND
  2881.       END SUB
  2882. ' $SUBTITLE: 'CTLINES - subroutine to determine file categories '
  2883. ' $PAGE
  2884. '
  2885. '  SUBROUTINE NAME    -- CTLINES
  2886. '
  2887. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2888. '                        DIR.CATEGORY.FILE$    NAME OF THE FILE THAT HAS THE
  2889. '                                              NUMBER OF CATEGORIES IN IT.
  2890. '
  2891. '  OUTPUT PARAMETERS  -- MAX.ENTRIES           NUMBER OF FILE CATEGORIES
  2892. '
  2893. '  SUBROUTINE PURPOSE -- SUBROUTINE TO COUNT THE NUMBER OF CATEGORIES THAT A
  2894. '                        FILE CAN BE CLASSIFIED INTO.
  2895. '
  2896.       SUB CTLINES (MAX.ENTRIES) STATIC
  2897. 58160 MAX.ENTRIES = 3
  2898.       CALL FINDIT (DIR.CATEGORY.FILE$)
  2899.       IF OK THEN _
  2900.          WHILE NOT EOF(2):_
  2901.            MAX.ENTRIES = MAX.ENTRIES + 1:_
  2902.            LINE INPUT #2,A$:_
  2903.          WEND
  2904.       CLOSE 2
  2905.       IF MAX.ENTRIES < 10 THEN _
  2906.          MAX.ENTRIES = 10
  2907.       END SUB
  2908. ' $SUBTITLE: 'INITFMS - subroutine to initialize file management system'
  2909. ' $PAGE
  2910. '
  2911. '  SUBROUTINE NAME    -- INITFMS
  2912. '
  2913. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2914. '                        UPLOAD.DIRECTORY$
  2915. '
  2916. '  OUTPUT PARAMETERS  -- CATEGORY.NAME$(), elements 1,2, possibly more
  2917. '                        CATEGORY.CODE$(), elements 1,2, possibly more
  2918. '                        CATEGORY.DESC$(), elements 1,2, possibly more
  2919. '                        CATEGORY.INDEX count of # elements in upload
  2920. '                           management system
  2921. '
  2922. '  SUBROUTINE PURPOSE -- SUBROUTINE TO INITIALIZE THE RBBS-PC UPLOAD MANAGEMENT
  2923. '                        SYSTEM
  2924.       SUB INITFMS (CATEGORY.NAME$(1),CATEGORY.CODE$(1),_
  2925.                    CATEGORY.DESC$(1),CATEGORY.INDEX) STATIC
  2926.       BLNK$ = " "
  2927.       CATEGORY.INDEX = 0
  2928.       IF FMS.DIRECTORY$ <> "" THEN _
  2929.          CATEGORY.INDEX = CATEGORY.INDEX + 1:_
  2930.          CATN$ = CATEGORY.NAME$(CATEGORY.INDEX) : _
  2931.          CALL BRKFNAME (FMS.DIRECTORY$,DRVPATH$,CATN$,EXTENSION$,FALSE) : _
  2932.          CATEGORY.NAME$(CATEGORY.INDEX) = CATN$ : _
  2933.          CATEGORY.CODE$(CATEGORY.INDEX) = "":_
  2934.          CATEGORY.DESC$(CATEGORY.INDEX) = "All uploads"_
  2935.       ELSE_
  2936.          LIMIT.SEARCH.TO.FMS = FALSE:_
  2937.          EXIT SUB
  2938.       IF LIMIT.SEARCH.TO.FMS THEN _
  2939.          CATEGORY.INDEX = CATEGORY.INDEX + 1 : _
  2940.          CATEGORY.NAME$(CATEGORY.INDEX) = "ALL" : _
  2941.          CATEGORY.CODE$(CATEGORY.INDEX) = "" : _
  2942.          CATEGORY.DESC$(CATEGORY.INDEX) = "All files"
  2943.       CALL FINDIT (DIR.CATEGORY.FILE$)
  2944.       IF NOT OK THEN _
  2945.          EXIT SUB
  2946.       WHILE NOT EOF(2)
  2947.          CATEGORY.INDEX = CATEGORY.INDEX + 1
  2948.          INPUT #2, CATEGORY.NAME$(CATEGORY.INDEX),_
  2949.                    CATEGORY.CODE$(CATEGORY.INDEX),_
  2950.                    CATEGORY.DESC$(CATEGORY.INDEX)
  2951.          CATR$ = CATEGORY.CODE$(CATEGORY.INDEX)
  2952.          CALL REMOVE (CATR$,BLNK$)
  2953.          CATEGORY.CODE$(CATEGORY.INDEX) = CATR$
  2954.       WEND
  2955.       CLOSE 2
  2956.       END SUB
  2957. ' $SUBTITLE: 'DISUPDIR - subroutine to display upload direcotry'
  2958. ' $PAGE
  2959. '
  2960. '  SUBROUTINE NAME    -- DISUPDIR
  2961. '
  2962. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2963. '                     PASSED.CATEGORIES$    FILE "CATEGORIES" TO BE INCLUDED IN
  2964. '                                           THE SEARCH.
  2965. '                        SEARCH.STRING$     STRING TO SEARCH ON WITHIN THE
  2966. '                                           FILE "CATEGORIES" SELECTED
  2967. '                        SEARCH.DATE$       DATE EQUAL TO OR GREATER THAN TO BE
  2968. '                                           SEARCHED FOR WITH THE "CATEGORIES"
  2969. '                                           AND THE STRING TO SEARCH.
  2970. '                        DOWNLOAD.FLAG      SET TO RECORD # OF LINE TO BEGIN
  2971. '                                           VIEWING - 0 IF AT END
  2972. '
  2973. '  OUTPUT PARAMETERS  -- DOWNLOAD.FLAG      WHENEVER DOWNLOAD REQUESTED, SETS
  2974. '                                           TO NEXT RECORD TO VIEW.  OTHERWISE
  2975. '                                           LEAVES AT ZERO
  2976. '
  2977. '  SUBROUTINE PURPOSE -- DISPLAY THE FILES THAT MEET THE CRITERIA SELECTED IN
  2978. '                        RBBS-PC UPLOAD MANAGEMENT SYSTEM ON THE USERS SCREEN.
  2979. '
  2980.       SUB DISUPDIR (PASSED.CATEGORIES$,SEARCH.STRING$,SEARCH.DATE$,_
  2981.                     DOWNLOAD.FLAG) STATIC
  2982. 58170 CALL ALLCAPS (SEARCH.STRING$)
  2983.       BLNK$ = " "
  2984.       STOP.INTERRUPTS = TRUE
  2985.       CATEGORIES$ = "," + PASSED.CATEGORIES$ + ","
  2986.       CAN.DOWNLOAD = (USER.SECURITY.LEVEL >= OPT.SEC(18))
  2987.       CALL OPENFMS (UPLOAD.INDEX)
  2988.       UPLOAD.INDEX = UPLOAD.INDEX + 1
  2989.       IF DOWNLOAD.FLAG > 0 THEN _
  2990.          UPLOAD.INDEX = DOWNLOAD.FLAG : _
  2991.          DOWNLOAD.FLAG = 0
  2992.       FIELD 2,(33+MAX.DESC.LEN) AS PART.TO.PRINT$,_
  2993.                3 AS CATEGORY$,_
  2994.                2 AS FILLER$
  2995.       MAX.PRINT = PAGE.LENGTH - 1
  2996.       BELOW.MIN.SEC = (USER.SECURITY.LEVEL < MIN.SEC.TO.VIEW)
  2997.       NON.STOP = (PAGE.LENGTH < 1)
  2998.       CHECK.POINT = 0
  2999.       LINES.PRINTED = 0
  3000. 58171 UPLOAD.INDEX = UPLOAD.INDEX - 1
  3001.       IF UPLOAD.INDEX < 1 THEN _
  3002.          GOTO 58177
  3003.       GET #2,UPLOAD.INDEX
  3004. 58172 CHECK.POINT = CHECK.POINT + 1
  3005.       IF CATEGORY$ = "***" THEN _
  3006.          IF NOT SYSOP THEN _
  3007.             GOTO 58176
  3008.       IF CATEGORY$ = DEFAULT.CATEGORY.CODE$ THEN _
  3009.          IF BELOW.MIN.SEC THEN _
  3010.             GOTO 58176
  3011. 58173 IF LEN(CATEGORIES$) > 2 THEN _
  3012.          KEE$ = "," + CATEGORY$ + "," :_
  3013.          CALL REMOVE (KEE$,BLNK$):_
  3014.          IF INSTR(CATEGORIES$,KEE$)=0 THEN _
  3015.             GOTO 58176
  3016.       IF SEARCH.STRING$ <> "" THEN _
  3017.          A$ = PART.TO.PRINT$ : _
  3018.          CALL ALLCAPS (A$) : _
  3019.          IF INSTR (A$,SEARCH.STRING$) = 0 THEN _
  3020.             GOTO 58176
  3021. 58174 IF SEARCH.DATE$ <> "" THEN _
  3022.          KEE$ = MID$(PART.TO.PRINT$,30,2) + _
  3023.                 MID$(PART.TO.PRINT$,24,2) + _
  3024.                 MID$(PART.TO.PRINT$,27,2) : _
  3025.          IF KEE$ < SEARCH.DATE$ THEN _
  3026.             GOTO 58177
  3027. '
  3028. ' *****************************************************************************
  3029. ' * Allow the FMS to be both fast and interruptable if a local                *
  3030. ' * user or there is nothing in the input buffer by using QTPUT.              *
  3031. ' *****************************************************************************
  3032. '
  3033. 58175 IF LOCAL.USER THEN _
  3034.          CALL QTPUT(PART.TO.PRINT$,1) _
  3035.       ELSE _
  3036.          IF EOF(3) THEN _
  3037.             CALL QTPUT(PART.TO.PRINT$,1) : _
  3038.          ELSE _
  3039.             A$ = PART.TO.PRINT$ : _
  3040.             SUBROUTINE.PARAMETER = 1 : _
  3041.             CALL TPUT : _
  3042.             IF RET THEN _
  3043.                GOTO 58177
  3044. 58176 IF LINES.PRINTED <= MAX.PRINT AND CHECK.POINT < 1000 THEN _
  3045.          GOTO 58171
  3046.       CALL CARRIER
  3047.       IF NOT LOCAL.USER AND SUBROUTINE.PARAMETER=-1 THEN _
  3048.          GOTO 58177
  3049.       CALL TIMEREMAIN (TIME.REMAINING!)
  3050.       IF TIME.REMAINING! < 0.1 THEN _
  3051.          SUBROUTINE.PARAMETER = -1 : _
  3052.          GOTO 58177
  3053.       IF NON.STOP THEN _
  3054.          GOTO 58171
  3055.       IF LINES.PRINTED <= MAX.PRINT THEN _
  3056.          CALL QTPUT ("Files checked thru "+MID$(PART.TO.PRINT$,24,8),1)
  3057.       A$ = "MORE: [Y],N,NS" + _
  3058.            LEFT$(", or file(s) to download",-24*CAN.DOWNLOAD)
  3059.       SUBROUTINE.PARAMETER = 1
  3060.       NO.ADVANCE = TRUE
  3061.       CALL TGET
  3062.       IF NOT LOCAL.USER AND SUBROUTINE.PARAMETER = -1 THEN _
  3063.          GOTO 58177
  3064.       IF NO THEN_
  3065.          CALL WIPELINE (42) : _
  3066.          GOTO 58177
  3067.       IF LEN(B$(1))>2 THEN _
  3068.          IF NOT YES AND CAN.DOWNLOAD THEN _
  3069.             CALL SKIPLINE (1) : _
  3070.             DOWNLOAD.FLAG = UPLOAD.INDEX : _
  3071.             EXIT SUB
  3072.       CALL WIPELINE (42)
  3073.       IF NON.STOP THEN IF UPLOAD.INDEX > 999 THEN _
  3074.          IF (SEARCH.DATE$="" OR NOT EXPERT.USER) THEN_
  3075.             A$ = STR$(UPLOAD.INDEX) + _
  3076.                " files left to search.  Really go non-stop? (Y/[N])":_
  3077.             NO.ADVANCE = TRUE : _
  3078.            CALL TGET :_
  3079.            CALL WIPELINE (79) : _
  3080.            IF NOT YES THEN _
  3081.               NON.STOP = FALSE
  3082.       CHECK.POINT = 0
  3083.       GOTO 58171
  3084. 58177 CLOSE 2
  3085.       NON.STOP = (PAGE.LENGTH < 1)
  3086.       STOP.INTERRUPTS = FALSE
  3087.       A$ = ""
  3088.       END SUB
  3089. ' $SUBTITLE: 'CHKNARY - subroutine to check for a string in an array'
  3090. ' $PAGE
  3091. '
  3092. '  SUBROUTINE NAME    -- CHKNARY
  3093. '
  3094. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  3095. '                        ELEMENT$                THE STRING TO CHECK FOR
  3096. '                        ARRAY$()                THE ARRAY TO BE SEARCHED
  3097. '                        NUM.ENTRIES.TO.SEARCH   NUMBER OF ENTRIES WITHIN IN
  3098. '                                                THE ARRAY TO BE SEARCHED
  3099. '
  3100. '  OUTPUT PARAMETERS  -- IS.IN.ARA               0 = STRING NOT FOUND IN THE
  3101. '                                                    ARRAY SPECIFIED
  3102. '                                                OTHERWISE IT IS THE NUMBER OF
  3103. '                                                ELEMENT WITHIN THE ARRAY THAT
  3104. '                                                WAS FOUND TO MATCH
  3105. '
  3106. '  SUBROUTINE PURPOSE -- SEARCH AN ARRAY FOR A SPECIFIED STRING AND, IF FOUND,
  3107. '                        RETURN THE NUMBER OF THE ELEMENT THAT MATCHED.
  3108. '
  3109.       SUB CHKNARY (ELEMENT$,ARRAY$(1),NUM.ENTRIES.TO.SEARCH,IS.IN.ARA) STATIC
  3110. 58180 IS.IN.ARA = 1
  3111.       CALL ALLCAPS(ELEMENT$)
  3112.       MAX.TRIES = NUM.ENTRIES.TO.SEARCH + 1
  3113.       ARRAY$(MAX.TRIES) = ELEMENT$
  3114.       WHILE ARRAY$(IS.IN.ARA) <> ELEMENT$
  3115.          IS.IN.ARA = IS.IN.ARA + 1
  3116.       WEND
  3117.       IF IS.IN.ARA = MAX.TRIES THEN _
  3118.          IS.IN.ARA = 0
  3119.       END SUB
  3120. ' $SUBTITLE: 'FMS - subroutine to search the upload management system'
  3121. ' $PAGE
  3122. '
  3123. '  SUBROUTINE NAME    -- FMS
  3124. '
  3125. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  3126. '                        DIR.TO.SEARCH$          RBBS-PC "DIR" CATEGORY TO LOOK
  3127. '                                                FOR
  3128. '                        SEARCH.STRING$          STRING TO SEARCH FOR
  3129. '                        SEARCH.DATE$            DATE TO SEARCH FOR
  3130. '                        CATEGORY.NAME$()
  3131. '                        CATEGORY.CODE$()
  3132. '                        CATEGORY.DESC$()
  3133. '                        CAT.FOUND
  3134. '                        NUM.CATEGORIES
  3135. '
  3136. '  OUTPUT PARAMETERS  -- PROCESSED.IN.FMS
  3137. '                        DOWNLOAD.FLAG
  3138. '
  3139. '  SUBROUTINE PURPOSE -- TO SEARCH THE UPLOAD MANAGMENT SYSTEM AND DISPLAY THE
  3140. '                        FILES BEING SEARCHED FOR AS WELL AS THE CATEGORY DE-
  3141. '                        SCRIPTIONS
  3142. '
  3143.       SUB FMS (DIR.TO.SEARCH$,SEARCH.STRING$,SEARCH.DATE$,_
  3144.                PROCESSED.IN.FMS,CATEGORY.NAME$(1),CATEGORY.CODE$(1),_
  3145.                CATEGORY.DESC$(1),DOWNLOAD.FLAG,CAT.FOUND) STATIC
  3146. 58200 DOWNLOAD.FLAG = 0
  3147.       CALL CHKNARY (DIR.TO.SEARCH$,CATEGORY.NAME$(),NUM.CATEGORIES,CAT.FOUND)
  3148.       IF CAT.FOUND > 0 THEN _
  3149.          SUBROUTINE.PARAMETER = 5 : _
  3150.          GOSUB 58202 : _
  3151.          A$ = "Scanning directory " + DIR.TO.SEARCH$ + HDR$ + _
  3152.               " - " + CATEGORY.DESC$(CAT.FOUND) : _
  3153.          CALL TPUT : _
  3154.          CAT$ = CATEGORY.CODE$(CAT.FOUND) : _
  3155.          CALL DISUPDIR (CAT$,SEARCH.STRING$,SEARCH.DATE$,DOWNLOAD.FLAG)
  3156.       PROCESSED.IN.FMS = (CAT.FOUND > 0)
  3157.       EXIT SUB
  3158. 58202 A$ = SEARCH.DATE$
  3159.       IF LEN(A$) > 0 THEN _
  3160.          A$ = MID$(A$,3) + LEFT$(A$,2)
  3161.       HDR$ = " for " + SEARCH.STRING$ + A$
  3162.       IF LEN(HDR$) < 6 THEN _
  3163.          HDR$ = ""
  3164.       RETURN
  3165.       END SUB
  3166. ' $SUBTITLE: 'REMOVE - subroutine to delete a string from within a string'
  3167. ' $PAGE
  3168. '
  3169. '  SUBROUTINE NAME    -- REMOVE
  3170. '
  3171. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  3172. '                        BADSTRING$              STRING CONTAINING CHARACTERS
  3173. '                                                TO BE DELETED FROM "L$"
  3174. '                        L$                      STRING TO BE ALTERED
  3175. '
  3176. '  OUTPUT PARAMETERS  -- L$                      WITH THE CHARACTERS IN
  3177. '                                                "BADSTRING#" DELETED FROM IT
  3178. '
  3179. '  SUBROUTINE PURPOSE -- TO REMOVE ALL INSTANCES OF THE CHARACTERS IN
  3180. '                        "BADSTRING$" FROM "L$"
  3181. '
  3182.       SUB REMOVE (L$,BADSTRNG$) STATIC
  3183. 58210 J = 0
  3184.       FOR I=1 TO LEN(L$)
  3185.          IF INSTR(BADSTRNG$,MID$(L$,I,1)) = 0 THEN_
  3186.             J = J+1:_
  3187.             MID$(L$,J,1) = MID$(L$,I,1)
  3188.       NEXT I
  3189.       L$ = LEFT$(L$,J)
  3190.       END SUB
  3191. ' $SUBTITLE: 'BUFSTRNG - subroutine to write a string with imbedded CR/LF'
  3192. ' $PAGE
  3193. '
  3194. '  SUBROUTINE NAME    -- BUFSTRNG
  3195. '
  3196. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  3197. '                        STRNG$                  STRING TO BE WRITTEN OUT
  3198. '                        DATA.SIZE               LENGTH OF STRING - # LEFT
  3199. '                                                    CHARS TO OUTPUT
  3200. '
  3201. '  OUTPUT PARAMETERS  -- STRNG$                  IS WRITTEN TO THE USER
  3202. '
  3203. '  SUBROUTINE PURPOSE -- TO SEARCH THE STRING, STRNG$, FOR IMBEDDED CARRIAGE
  3204. '                        RETURNS AND LINE FEEDS AND WRITE OUT EACH LINE WITH
  3205. '                        THE APPROPRIATE SUBSTITUTION (CR/LF IF TO THE LOCAL
  3206. '                        SCREEN OR CR/NULLS/LF IF TO THE COMMUNICATIONS PORT).
  3207. '
  3208. 58300 SUB BUFSTRNG (STRNG$,DATA.SIZE) STATIC
  3209.       IF LEN(STRNG$) < 1 THEN _                                      ' CPC15-1B
  3210.          EXIT SUB                                                    ' CPC15-1B
  3211.       FF = PAGE.LENGTH - 1
  3212.       START.BYTE = 1 - (ASC(STRNG$)=10)
  3213.       IF LEN(STRNG$) < 1 THEN _
  3214.          EXIT SUB
  3215. 58301 CRAT = INSTR(START.BYTE,STRNG$,CARRIAGE.RETURN$)
  3216.       CR.FOUND = (CRAT > 0)
  3217.       EOL.LEN = -2 * CR.FOUND
  3218.       IF CR.FOUND THEN _
  3219.      EOD = CRAT _
  3220.       ELSE EOD = DATA.SIZE + 1
  3221.       NUM.BYTES = EOD - START.BYTE
  3222.       CALL QTPUT (MID$(STRNG$,START.BYTE,NUM.BYTES),-(CR.FOUND))
  3223.       IF RET THEN _
  3224.          GOTO 58309
  3225.       IF LINES.PRINTED < FF THEN _
  3226.          GOTO 58304
  3227.       CALL CARRIER
  3228.       IF NOT LOCAL.USER AND SUBROUTINE.PARAMETER = -1 THEN _
  3229.          GOTO 58309
  3230.       IF NON.STOP THEN _
  3231.          GOTO 58304
  3232.       IF STOP.INTERRUPTS THEN _
  3233.          A$ = "MORE: [Y],N,NS" _
  3234.       ELSE _
  3235.          A$ = "Press [ENTER] to continue"
  3236.       LINES.PRINTED = 0
  3237.       SUBROUTINE.PARAMETER = 1
  3238.       NO.ADVANCE = TRUE
  3239.       CALL TGET
  3240.       CALL WIPELINE (26)
  3241.       IF NO THEN _
  3242.          IF STOP.INTERRUPTS THEN _
  3243.             GOTO 58309
  3244. 58304 START.BYTE = EOD + EOL.LEN
  3245.       IF START.BYTE <= DATA.SIZE THEN _
  3246.          GOTO 58301
  3247.       EXIT SUB
  3248. 58309 'Common ABORT routine
  3249.       STOP.FILE = TRUE
  3250.       END SUB
  3251. ' $SUBTITLE: 'BUFFILE - subroutine to write a sequential file to the user'
  3252. ' $PAGE
  3253. '
  3254. '  SUBROUTINE NAME    -- BUFFILE
  3255. '
  3256. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  3257. '                        FILENAME$               NAME OF THE FILE TO WRITE TO
  3258. '                                                OUT TO THE USER
  3259. '
  3260. '  OUTPUT PARAMETERS  -- NONE                    FILE IS WRITTEN TO THE USER
  3261. '
  3262. '  SUBROUTINE PURPOSE -- TO DISPLAY A SEQUENTIAL FILE TO THE USER
  3263. '
  3264. 58400 SUB BUFFILE (FILNAME$) STATIC
  3265.       CALL FINDIT (FILNAME$)
  3266.       IF NOT OK THEN _
  3267.          EXIT SUB
  3268.       CALL OPENRSEQ (FILNAME$,NUM.RECS,LEN.LAST.REC)
  3269.       DATA.SIZE = BUFFER.SIZE
  3270.       FIELD 2, DATA.SIZE AS SEQ.REC$
  3271.       NON.STOP = (PAGE.LENGTH < 1)
  3272.       STOP.FILE = FALSE
  3273.       IF STOP.INTERRUPTS THEN _
  3274.          A$ = "* <Ctrl K>/<Ctrl X> aborts <Ctrl S> suspends *" : _
  3275.          SUBROUTINE.PARAMETER = 2 : _
  3276.          CALL TPUT
  3277.       TU = 0
  3278. 58405 TU = TU + 1
  3279.       IF TU < NUM.RECS THEN_
  3280.          GET 2,TU _
  3281.       ELSE IF TU = NUM.RECS THEN _
  3282.               GET 2,TU : _
  3283.               X = INSTR(SEQ.REC$,CHR$(26)) :_
  3284.               IF X=0 OR X > LEN.LAST.REC THEN _
  3285.                  DATA.SIZE = LEN.LAST.REC _
  3286.               ELSE DATA.SIZE = X-1 _
  3287.            ELSE GOTO 58419
  3288.       IF (NOT STOP.INTERRUPTS) THEN _
  3289.          CALL BUFSTRNG (SEQ.REC$,DATA.SIZE)_
  3290.       ELSE IF LOCAL.USER THEN _
  3291.               CALL BUFSTRNG (SEQ.REC$,DATA.SIZE)_
  3292.       ELSE IF EOF(3) THEN _
  3293.               CALL BUFSTRNG (SEQ.REC$,DATA.SIZE)_
  3294.       ELSE _
  3295.           A$ = LEFT$(SEQ.REC$,DATA.SIZE) : _
  3296.           SUBROUTINE.PARAMETER = 4 : _
  3297.           CALL TPUT : _
  3298.           IF SUBROUTINE.PARAMETER = -1 OR RET THEN _
  3299.              GOTO 58419
  3300.       CALL TIMEREMAIN (TIME.REMAINING!)
  3301.       IF TIME.REMAINING! < 0.1 THEN _
  3302.          GOTO 58419
  3303.       IF NOT STOP.FILE THEN _
  3304.          GOTO 58405
  3305. 58419 CLOSE 2
  3306.       NON.STOP = (PAGE.LENGTH < 1)
  3307.       END SUB
  3308. ' $SUBTITLE: 'FINDLAST - subroutine to find last occurence of a string'
  3309. ' $PAGE
  3310. '
  3311. '  SUBROUTINE NAME    -- FINDLAST
  3312. '
  3313. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  3314. '                        LOOK.IN$           STRING TO LOOK INTO
  3315. '                        LOOK.FOR$          STRING TO SEARCH FOR
  3316. '
  3317. '  OUTPUT PARAMETERS  -- WHERE.FOUND        POSITION IN LOOK.IN$ THAT
  3318. '                                            LOOK.FOR$ FOUND
  3319. '                        NUM.FINDS          HOW MANY OCCURENCES IN LOOK.IN$
  3320. '
  3321. '  SUBROUTINE PURPOSE -- Finds last occurence of LOOK.FOR$ in LOOK.IN$ and
  3322. '                        returns count of # of occurences.  If none found,
  3323. '                        both returned parms are 0.
  3324. '
  3325.       SUB FINDLAST (LOOK.IN$,LOOK.FOR$,WHERE.FOUND,NUM.FINDS) STATIC
  3326. 58600 WHERE.FOUND = INSTR(LOOK.IN$,LOOK.FOR$)
  3327.       NUM.FINDS = -(WHERE.FOUND > 0)
  3328.       NEXT.FOUND = INSTR(WHERE.FOUND+1,LOOK.IN$,LOOK.FOR$)
  3329.       WHILE NEXT.FOUND > 0
  3330.         NUM.FINDS = NUM.FINDS + 1
  3331.         WHERE.FOUND = NEXT.FOUND
  3332.         NEXT.FOUND = INSTR(WHERE.FOUND+1,LOOK.IN$,LOOK.FOR$)
  3333.       WEND
  3334.       END SUB
  3335. ' $SUBTITLE: 'ROTORSDIR - search thru a list of subdirs for a file'
  3336. ' $PAGE
  3337. '
  3338. '  SUBROUTINE NAME    -- ROTORSDIR
  3339. '
  3340. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  3341. '                        FILNAME$                  FILE NAME TO LOOK FOR
  3342. '                        SDIR.ARA                  ARRAY OF SUBDIRECTORIES
  3343. '                        MAX.SEARCH                MAX # OF SUBDIRECTORIES
  3344. '
  3345. '   OUTPUT PARAMETERS -- FNAME$                    ADD SUBDIRECTORY TO THE
  3346. '                                                  FILE NAME IF FOUND.  OTHER-
  3347. '                                                  WISE DON'T.
  3348. '                        OK                        TRUE IF FILE WAS FOUND
  3349. '
  3350. '  SUBROUTINE PURPOSE -- HUNT THROUGH A LIST OF SUBDIRECTORIES TO DETERMINE
  3351. '                        IF A FILE IS IN ANY OF THEM.  IF FILE IS FOUND, OPEN
  3352. '                        THE FILE AS FILE #2, ADD THE DRIVE/PATH TO THE FILE
  3353. '                        NAME, AND SETS OK TO TRUE.  IF FILE ISN'T FOUND, SET
  3354. '                        FILE NAME TO THE LAST SUBDIRECTORY SEARCHED -- WHICH
  3355. '                        SHOULD BE THE UPLOAD SUBDIRECTORY.
  3356. '
  3357.       SUB ROTORSDIR (FILNAME$,SDIR.ARA$(1),MAX.SEARCH) STATIC
  3358. 58700 OK = FALSE
  3359.       NUM.SEARCH = 1
  3360.       WHILE (NOT OK) AND NUM.SEARCH <= MAX.SEARCH AND_
  3361.         SDIR.ARA$(NUM.SEARCH)<>""
  3362.           X$ = SDIR.ARA$(NUM.SEARCH) + FILNAME$
  3363.           CALL FINDIT (X$)
  3364.           NUM.SEARCH = NUM.SEARCH + 1
  3365.       WEND
  3366.       FILNAME$ = X$
  3367.       END SUB
  3368. ' $SUBTITLE: 'WIPELINE - Wipe away a line so next overprints'
  3369. ' $PAGE
  3370. '
  3371. '  SUBROUTINE NAME    -- WIPELINE
  3372. '
  3373. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  3374. '                            CARRIAGE.RETURN$
  3375. '                            CHARS.TO.WIPE            # OF CHARACTERS TO BLANK
  3376. '                            NULLS
  3377. '
  3378. '   OUTPUT PARAMETERS -- NONE
  3379. '
  3380. '  SUBROUTINE PURPOSE -- WIPE AWAY A LINE AND LEAVE CURSOR AT BEGINNING OF THE
  3381. '                        SAME LINE SO THAT THE NEXT LINE WILL PRINT IN ITS
  3382. '                        PLACE
  3383. '
  3384.       SUB WIPELINE (CHARS.TO.WIPE) STATIC
  3385. 58800 IF NULLS THEN _
  3386.          CALL SKIPLINE (1) : _
  3387.          EXIT SUB
  3388.       IF NOT LOCAL.USER THEN _
  3389.          PRINT #3,CARRIAGE.RETURN$;SPACE$(CHARS.TO.WIPE);CARRIAGE.RETURN$
  3390.       IF SNOOP THEN _
  3391.          LOCATE ,1 :  _
  3392.          PRINT SPACE$(CHARS.TO.WIPE); : _
  3393.          LOCATE ,1
  3394.       END SUB
  3395. ' $SUBTITLE: 'GETDIRS -- Prompt for directories to search'
  3396. ' $PAGE
  3397. '
  3398. '  SUBROUTINE NAME    -- GETDIRS
  3399. '
  3400. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  3401. '                             STRNG$                  OPTION TO ADD IN PROMPT
  3402. '                                                     TO EXPLAIN ENTER
  3403. '                             DIR.PROMPT$             BASE OF DIRECTORY PROMPT
  3404. '
  3405. '   OUTPUT PARAMETERS --     B$
  3406. '                            Q
  3407. '  SUBROUTINE PURPOSE -- Prompt for directories to search
  3408. '
  3409.       SUB GETDIRS (STRNG$) STATIC
  3410. 58900 A$ = DIR.PROMPT$ + STRNG$ + ")"
  3411.       SUBROUTINE.PARAMETER = 1
  3412.       CALL TGET
  3413.       IF Q = 0 OR SUBROUTINE.PARAMETER = -1 THEN _
  3414.          EXIT SUB
  3415.       IF INSTR("Hh",B$(1)) THEN _
  3416.          CALL BUFFILE (DIRECTORY.PATH$+DIRECTORY.EXTENTION$+_
  3417.                       "."+DIRECTORY.EXTENTION$):_
  3418.          GOTO 58900
  3419.       END SUB
  3420. '
  3421. ' $SUBTITLE: 'CONVDIRS -- Converts coded response to right directory'
  3422. ' $PAGE
  3423. '
  3424. '  SUBROUTINE NAME    -- CONVDIRS
  3425. '
  3426. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  3427. '                            STRT               ELEMENT TO BEGIN WITH
  3428. '                            B$                 ARRAY TO CONVERT
  3429. '                            Q                  LAST ELEMENT TO CONFERT
  3430. '
  3431. '   OUTPUT PARAMETERS --     B$                 CONVERTED DIRECTORY LIST
  3432. '
  3433. '  SUBROUTINE PURPOSE -- LET THE USER PUT IN A SHORT STANDARD STRING FOR A
  3434. '                        DIRECTORY
  3435. '
  3436. '
  3437. 58950 SUB CONVDIRS (STRT) STATIC
  3438.       FOR I=STRT TO Q
  3439.           CALL ALLCAPSD(B$(),I)
  3440.           IF B$(I)="U" THEN _
  3441.              B$(I) = UPLOAD.DIR.CHECK$
  3442.           IF B$(I) = "A" THEN _
  3443.              B$(I) = "ALL"
  3444.           IF B$(I) = "ALL" THEN _
  3445.              IF MASTER.DIRECTORY.NAME$ <> "" THEN _
  3446.                 B$(I) = MASTER.DIRECTORY.NAME$ : _
  3447.                 IF USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW THEN _
  3448.                    Q = Q + 1 : _
  3449.                    B$(Q) = UPLOAD.DIR.CHECK$
  3450.       NEXT
  3451.       END SUB
  3452. ' $SUBTITLE: 'MUSIC - subroutine to PLAY MUSIC'
  3453. ' $PAGE
  3454. '
  3455. '  SUBROUTINE NAME    -- MUSIC
  3456. '
  3457. '  INPUT PARAMETERS   --   PARAMETER     MEANING
  3458. '                                 1   PLAY CONSIDER YOURSELF(OPENING SCREEN)
  3459. '                                 2   PLAY WALK RIGHT IN(NEW USERS)
  3460. '                                 3   PLAY DRAGNET (SECURITY VIOLATION)
  3461. '                                 4   PLAY GOODBYE CHARLIE (GOODBYE)
  3462. '                                 5   PLAY TAPS (ACCESS DENIED)
  3463. '                                 6   PLAY OOM PAH PAH (DOWNLOAD)
  3464. '                                 7   PLAY THNKS FOR MEMORIES(UPLOAD)
  3465. '
  3466. '  OUTPUT PARAMETERS  -- NONE
  3467. '
  3468. '  SUBROUTINE PURPOSE -- PROVIDE SYSOP'S AND THE VISUALLY IMPARED WITH
  3469. '                        AUDITORY FEEDBACK ON WHAT RBBS-PC IS DOING
  3470. '
  3471.       SUB MUSIC (PASSED.ARG) STATIC
  3472. 59100 FF = PASSED.ARG
  3473.       SUBROUTINE.PARAMETER = 0
  3474.       IF (NOT MUSIC) OR LOCAL.USER.MODE THEN _
  3475.          EXIT SUB
  3476.       ON FF GOTO 59102,59104,59106,59108,59110,59112,59114
  3477.       EXIT SUB
  3478. 59102 '---[Introduction CONSIDER YOURSELF]---
  3479.     LEC$ = "MBT180A4B-8B-8B-8B-2.G4A8F2"
  3480.     PLAY "O2 X" + VARPTR$(LEC$)
  3481.     EXIT SUB
  3482. 59104 '---[New User WALK RIGHT IN]---
  3483.     LEC1$ = "MBT180G4G4D2G8F+8F8E2A8B8":LEC2$="C8C+8D8C8":LEC3$="B4G2"
  3484.     PLAY "O2 X"+VARPTR$(LEC1$)+"O3 X"+VARPTR$(LEC2$)+"O2 X"+VARPTR$(LEC3$)
  3485.     EXIT SUB
  3486. 59106 '---[Security Violation DRAGNET THEME]---
  3487.      LEC$ = "MBT120C2D8E-4C2.C2D8E-4C4G-2."
  3488.      PLAY "O2 X" + VARPTR$(LEC$)
  3489.      EXIT SUB
  3490. 59108 '---[Goodbye GOODBYE CHARLIE]---
  3491.       LEC$ = "MBT180B-2.G2.F4D2."
  3492.       PLAY "O2 X" + VARPTR$(LEC$)
  3493.       EXIT SUB
  3494. 59110 '---[Access Denied TAPS]---
  3495.       LEC1$ = "MBT90F8A16":LEC2$="C4.":LEC3$="A4F4C2.C8C16F2"
  3496.       PLAY "O2 X"+VARPTR$(LEC1$)+"O3 X"+VARPTR$(LEC2$)+"O2 X"+VARPTR$(LEC3$)
  3497.       EXIT SUB
  3498. 59112 '---[Download OOM PAH PAH]---
  3499.        LEC$ = "MBT180F4A4A4C4A4A4G4A4G4D2"
  3500.        PLAY "O2 X" + VARPTR$(LEC$)
  3501.        EXIT SUB
  3502. 59114 '---[Upload THANKS FOR THE MEMORIES]---
  3503.        LEC1$ = "MBT180C2." :LEC2$ = "A8G8F4D2"
  3504.        PLAY "O3 X" + VARPTR$(LEC1$)+ "O2 X" + VARPTR$(LEC2$)
  3505.        END SUB
  3506. ' $SUBTITLE: 'TWOBYTEDATE -- subroutine to put date in two bytes'
  3507. ' $PAGE
  3508. '
  3509. '  SUBROUTINE NAME    -- TWOBYTEDATE
  3510. '
  3511. '  INPUT PARAMETERS   --   PARAMETER     MEANING
  3512. '                             YY       FOUR DIGIT YEAR (I.E. 1987)
  3513. '                             MM       MONTH
  3514. '                             DD       DAY
  3515. '                           RESULT$    LOCATION TO PLACE THE RESULT
  3516. '
  3517. '  OUTPUT PARAMETERS  -- RESULT$       TWO BYTE COMPRESSED DATE FOR USE IN
  3518. '                                      A RANDOM RECORD
  3519. '
  3520. '  SUBROUTINE PURPOSE -- COMPRESS AN 8-CHARACTER DATE INTO TWO CHARACTERS
  3521.       SUB TWOBYTEDATE (YY,MM,DD,RESULT$) STATIC
  3522. 59200 RESULT$ = CHR$(((YY-1980)*2) OR -((MM AND 8)<>0)) + _
  3523.                 CHR$((MM AND NOT 8)*32+DD)
  3524.       END SUB
  3525. ' $SUBTITLE: 'GETYMD -- subroutine to unpack a two-byte date'
  3526. ' $PAGE
  3527. '
  3528. '  SUBROUTINE NAME    -- GETYMD
  3529. '
  3530. '  INPUT PARAMETERS   --   PARAMETER     MEANING
  3531. '                          TWOBYTE$    PACKED TWO-BYTE DATE FIELD
  3532. '                            YMD       1 = YEAR
  3533. '                                      2 = MONTH
  3534. '                                      3 = DAY
  3535. '                           RESULT     LOCATION TO PLACE THE RESULT
  3536. '
  3537. '  OUTPUT PARAMETERS  -- RESULT        FOUR DIGIT RESULT OF UNPAKING THE DATE
  3538. '
  3539. '  SUBROUTINE PURPOSE -- UNPACK A COMPRESSED TWO-BYTE DATE FIELD
  3540. '
  3541.       SUB GETYMD (TWOBYTE$,YMD,RESULT) STATIC
  3542.       ON YMD GOTO 59205,59210,59215
  3543.       EXIT SUB
  3544. 59205 RESULT = (ASC(TWOBYTE$)AND NOT 1)/2 + 1980
  3545.       EXIT SUB
  3546. 59210 RESULT = FIX((ASC(MID$(TWOBYTE$,2))/32))OR((ASC(TWOBYTE$)AND 1)*8)
  3547.       EXIT SUB
  3548. 59215 RESULT = ASC(MID$(TWOBYTE$,2))AND NOT 224
  3549.       END SUB
  3550. ' $SUBTITLE: 'COMPDATE -- subroutine to compute elased days'
  3551. ' $PAGE
  3552. '
  3553. '  SUBROUTINE NAME    -- COMPDATE
  3554. '
  3555. '  INPUT PARAMETERS   --   PARAMETER     MEANING
  3556. '                            YY        YEAR
  3557. '                            MM        MONTH
  3558. '                            DD        DAY
  3559. '                           RESULT!    LOCATION TO PLACE THE RESULT
  3560. '
  3561. '  OUTPUT PARAMETERS  -- RESULT!       COMPUTE COMPUTATIONAL DATE
  3562. '
  3563. '  SUBROUTINE PURPOSE -- COMPUTES A COMPUTATIONAL DATE FROM YEAR, MONTH, DAY.
  3564. '                        RESULTS MAY BE USED TO COMPUTE THE NUMBER OF ELASPED
  3565. '                        DAYS BETWEEN TWO DATES.  YOU MAY PASS A 2 OR 4 DIGIT
  3566. '                        YEAR, BUT FOR MEANINGFUL RESULTS, BE CONSISTENT
  3567. '
  3568.       SUB COMPDATE (YY,MM,DD,RESULT!) STATIC
  3569.       RESULT! = YY*365.0 + _
  3570.                 INT((YY-1)/4) + _
  3571.                 (MM-1)*28 + _
  3572.                 VAL(MID$("000303060811131619212426",(MM-1)*2+1,2)) - _
  3573.                 ((MM>2)AND((YY MOD 4)=0)) + _
  3574.                 DD
  3575.       END SUB
  3576. ' $SUBTITLE: 'PROTOCOL - check for external protocols'
  3577. ' $PAGE
  3578. '
  3579. '  SUBROUTINE NAME    -- PROTOCOL
  3580. '
  3581. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  3582. '                        TRANSFER.OPTIONS$         FILE TRANSFER PROTOCOLS
  3583. '                                                  THAT ARE ALLOWED.
  3584. '
  3585. '   OUTPUT PARAMETERS -- PCKERMIT.EXE.FILE$        FILE TO TRANSFER CONTROL TO
  3586. '                                                  FOR KERMIT PROTOCOL
  3587. '                        KERMIT.SUPPORT            SWITCH INDICATING KERMIT IS
  3588. '                                                  AVAILABLE
  3589. '                        XFER.COM.FILE$            FILE TO TRANSFER CONTROL TO
  3590. '                                                  FOR YMODEM, IMODEM & YMODEMG
  3591. '                        XFER.SUPPORT              SWITCH INDICATING THAT
  3592. '                                                  YMODEM, IMODEM & YMODEMG
  3593. '                                                  ARE AVAILABLE
  3594. '                        WXMODEM.COM.FILE$         FILE TO TRANSFER CONTROL TO
  3595. '                                                  FOR WXMODEM SUPPORT
  3596. '                        WXMODEM.SUPPORT           SWITCH INDICATING THAT
  3597. '                                                  WXMODEM IS AVAILABLE
  3598. '
  3599. '  SUBROUTINE PURPOSE -- TO DETERMINE IF EXTERNAL PROTOCOL'S ARE AVAILABLE
  3600. '
  3601.       SUB PROTOCOL STATIC
  3602. 62600 XFER.SUPPORT = TRUE
  3603.       WXMODEM.SUPPORT = TRUE
  3604.       KERMIT.SUPPORT = TRUE
  3605.       WXMODEM.COM.FILE$ = PROTOCOL.PATH$ + "WXMODEM.COM"
  3606.       CALL FINDIT (WXMODEM.COM.FILE$)
  3607.       IF NOT OK THEN _
  3608.          TRANSFER.OPTIONS$ = LEFT$(TRANSFER.OPTIONS$,71) + _
  3609.                              MID$(TRANSFER.OPTIONS$,82) : _
  3610.          WXMODEM.SUPPORT = FALSE
  3611.       XFER.COM.FILE$ = PROTOCOL.PATH$ + "QMXFER.COM"
  3612.       CALL FINDIT (XFER.COM.FILE$)
  3613.       IF NOT OK THEN _
  3614.          TRANSFER.OPTIONS$ = LEFT$(TRANSFER.OPTIONS$,42) + _
  3615.                              MID$(TRANSFER.OPTIONS$,72) : _
  3616.          XFER.SUPPORT = FALSE
  3617.       KERMIT.EXE.FILE$ = PROTOCOL.PATH$ + "PCKERMIT.EXE"
  3618.       CALL FINDIT (KERMIT.EXE.FILE$)
  3619.       IF NOT OK THEN _
  3620.          TRANSFER.OPTIONS$ = LEFT$(TRANSFER.OPTIONS$,33) + _
  3621.                              MID$(TRANSFER.OPTIONS$,43) : _
  3622.          KERMIT.SUPPORT = FALSE
  3623.       CLOSE 2
  3624.       IF KERMIT.SUPPORT = 0 AND _
  3625.          XFER.SUPPORT = 0 AND _
  3626.          WXMODEM.SUPPORT = 0 THEN _
  3627.          TRANSFER.OPTIONS$ = LEFT$(TRANSFER.OPTIONS$,31) + _
  3628.                              MID$(TRANSFER.OPTIONS$,34)
  3629.       END SUB
  3630. ' $SUBTITLE: 'TRANSFER - subroutine for KERMIT, YMODEM, IMODEM & YMODEM'
  3631. ' $PAGE
  3632. '
  3633. '  SUBROUTINE NAME    -- TRANSFER
  3634. '
  3635. '  INPUT PARAMETERS   --     PARAMETER                    MEANING
  3636. '                        TRANSFER.FUNCTION         = 1 DOWNLOAD FILE TO USER
  3637. '                                                  = 2 UPLOAD FILE TO RBBS-PC
  3638. '                        FILE.NAME$                NAME OF FILE FOR TRANSFER
  3639. '                        COM.PORT$                 NAME OF COMMUNICATIONS PORT
  3640. '                                                  TO BE USED BY KERMIT (COM1
  3641. '                                                  OR COM2)
  3642. '                        BPS                       = -1 FOR   300 BAUD
  3643. '                                                  = -2 FOR   450 BAUD
  3644. '                                                  = -3 FOR  1200 BAUD
  3645. '                                                  = -4 FOR  2400 BAUD
  3646. '                                                  = -5 FOR  4800 BAUD
  3647. '                                                  = -6 FOR  9600 BAUD
  3648. '                        PCKERMIT.EXE.FILE$        FILE TO TRANSFER CONTROL TO
  3649. '                                                  FOR KERMIT PROTOCOL ON
  3650. '                                                  PROTOCOL.PATH$.
  3651. '                        QMXFER.COM.FILE$          FILE TO TRANSFER CONTROL TO
  3652. '                                                  FOR YMODEM, IMODEM OR
  3653. '                                                  YMODEMG PROTOCOLS.
  3654. '                        WXMODEM.COM.FILE$         FILE TO TRANSFER CONTROL TO
  3655. '                                                  FOR WXMODEM PROTOCOL ON
  3656. '                                                  PROTOCOL.PATH$
  3657. '
  3658. '  OUTPUT PARAMETERS  -- NONE
  3659. '
  3660. '  SUBROUTINE PURPOSE -- TO TRANSFER FILES USING KERMIT, YMODEM, IMODEM,
  3661. '                        YMODEMG OR WXMODEM PROTOCOL'S
  3662. '
  3663. 62620 SUB TRANSFER STATIC
  3664.       IF PRIVATE.DOOR THEN _
  3665.          GOTO 62629
  3666.       IF TRANSFER.FUNCTION = 1 THEN _
  3667.          TRANSFER.COMMAND$ = "-s " : _
  3668.          A$ = " send of " _
  3669.       ELSE IF TRANSFER.FUNCTION = 2 THEN _
  3670.               TRANSFER.COMMAND$ = "-r ": _
  3671.               A$ = " receive of " : _
  3672.               IF FF = 4 THEN _
  3673.                  TRANSFER.COMMAND$ = TRANSFER.COMMAND$ + _
  3674.                                      "-a "
  3675.       IF FF <> 4 THEN _
  3676.          TRANSFER.COMMAND$ = TRANSFER.COMMAND$ + "-f "
  3677.       TRANSFER.COMMAND$ = TRANSFER.COMMAND$ + _
  3678.                           FILE.NAME$ + _
  3679.                           " -l " + COM.PORT$ + _
  3680.                           " -c" + _                 ' CARRIER DROP
  3681.                           " -b " + _                ' LINE SPEED
  3682.                           MID$("    300 4501200240048009600",(-4*BPS),4)
  3683.       IF FF = 4 THEN _
  3684.          TRANSFER.COMMAND$ = TRANSFER.COMMAND$ + _
  3685.                              " -p n" + _            ' PARITY = NONE
  3686.                              " -m 31" _             ' PACKETS
  3687.       ELSE TRANSFER.COMMAND$ = TRANSFER.COMMAND$ + _
  3688.                                " -p " + _
  3689.                                MID$("AXCKYIGW",FF,1) + _
  3690.                                " -n " + _
  3691.                                NODE.ID$
  3692.       ON FF GOTO 62628, _     ' 1 = ASCII FILE TRANSFER
  3693.                  62622, _     ' 2 = XMODEM (CHECKSUM) FILE TRANSFER
  3694.                  62622, _     ' 3 = XMODEM (CRC-16) FILE TRANSFER
  3695.                  62624, _     ' 4 = KERMIT FILE TRANSFER
  3696.                  62622, _     ' 5 = YMODEM FILE TRANSFER
  3697.                  62622, _     ' 6 = IMODEM FILE TRANSFER
  3698.                  62622, _     ' 7 = YMODEMG FILE TRANSFER
  3699.                  62626        ' 8 = WXMODEM FILE TRANSFER
  3700. 62622 B$ = "QMXFER"
  3701.       IF FF<4 THEN _
  3702.          Y$ = "XMODEM ":_
  3703.          IF FF=2 THEN _
  3704.             Y$ = Y$ + "(CHECKSUM)"_
  3705.          ELSE_
  3706.             Y$ = Y$ + "(CRC-16)"_
  3707.       ELSE_
  3708.          IF FF=6 THEN_
  3709.             Y$ = "IMODEM"_
  3710.          ELSE_
  3711.             Y$ = "YMODEM":_
  3712.             IF FF=7 THEN _
  3713.                Y$ = Y$ + "G"
  3714.       GOTO 62628
  3715. 62624 B$ = "PCKERMIT"
  3716.       Y$ = "KERMIT"
  3717.       GOTO 62628
  3718. 62626 B$ = "WXMODEM"
  3719.       Y$ = "XMODEM (WINDOWED)"
  3720. 62628 CLOSE 2
  3721.       OPEN NODE.WORK.FILE$ FOR OUTPUT AS #2
  3722.       B$ = PROTOCOL.PATH$ + B$ + " " + TRANSFER.COMMAND$
  3723.       PRINT #2,B$
  3724.       CLOSE 2
  3725.       CALL QTPUT (Y$ + A$ + FILE.NAME.HOLD$ + " ready!",1)
  3726.       IF GO.TO.SHELL THEN _
  3727.          GOTO 62629
  3728.       A$(1) = DISK.FOR.DOS$ + "COMMAND /C " + B$
  3729.       A$(2) = RBBS.BAT$
  3730.       PRIVATE.DOOR = TRUE
  3731.       CALL RBBSEXIT (A$(),2)
  3732. 62629 CLOSE 3
  3733.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  3734.       IF PRIVATE.DOOR THEN _
  3735.          PRIVATE.DOOR = FALSE : _
  3736.          GOTO 62630
  3737.       CALL DELAYIT (2)
  3738.       SHELL NODE.WORK.FILE$
  3739. 62630 OPEN.BAUD$ = MID$("    300 3001200240048009600",(-4*BPS),4)    ' CPC15-1B
  3740.       PARITY$ = MID$(",N,8,1,E,7,1",7 + 6*EIGHT.BIT,6)               ' CPC15-1B
  3741.       IF LOCAL.USER THEN _
  3742.          GOTO 62631
  3743.       CALL OPENCOM(OPEN.BAUD$,PARITY$)                               ' CPC15-1B
  3744.       CALL SKIPLINE (1)
  3745. 62631 IF TRANSFER.FUNCTION = 2 AND _
  3746.          FF = 4 THEN _
  3747.      CLS : _
  3748.          CALL LINE25
  3749. 62632 END SUB
  3750. ' $SUBTITLE: 'VIEWARC - subroutine to display .ARC contents'
  3751. ' $PAGE
  3752. '
  3753. '  SUBROUTINE NAME    --  VIEWARC  (Written by Jon Martin)
  3754. '
  3755. '  INPUT PARAMETERS   --  PARAMETER                   MEANING
  3756. '                         FILE.NAME$           NAME OF THE ARC FILE TO BE
  3757. '                                              VIEWED.
  3758. '
  3759. '  OUTPUT PARAMETERS  --  NONE
  3760. '
  3761. '  SUBROUTINE PURPOSE --  PROVIDES A MECHANISM TO PROVIDE USERS WITH THE
  3762. '                         CONTENTS OF AN ARC FILE PRIOR TO DOWNLOADING.
  3763.       SUB VIEWARC STATIC
  3764. 64600 IF TURBO.RBBS THEN _
  3765.          RETCODE% = 0 : _
  3766.          CALL ARCV (ARC.WORK$,FILE.NAME$,RETCODE%) : _
  3767.          CALL BUFFILE (ARC.WORK$) : _
  3768.          EXIT SUB
  3769.       CLOSE 2
  3770.       OPEN "R",2,FILE.NAME$,1
  3771.       FIELD 2,1 AS CHAR$
  3772.       BYTE.POINTER! = 1
  3773.       ARC.END! = LOF(2)
  3774. 64605 IF BYTE.POINTER! > ARC.END! THEN _
  3775.          GOTO 64620
  3776.       GET 2,BYTE.POINTER!
  3777.       IF CHAR$ <> CHR$(26) THEN _
  3778.          GOTO 64620
  3779.       BYTE.POINTER! = BYTE.POINTER! +1
  3780.       GET 2,BYTE.POINTER!
  3781.       IF CHAR$ = CHR$(0) THEN _
  3782.          GOTO 64620
  3783.       ARCED.NAME$ = ""
  3784.       FOR X = 1 TO 12
  3785.       GET 2,BYTE.POINTER! + X
  3786.       IF CHAR$ < CHR$(40) THEN _
  3787.          GOTO 64610
  3788.       ARCED.NAME$ = ARCED.NAME$ + CHAR$
  3789.       NEXT
  3790. 64610 A$ = ARCED.NAME$
  3791.       BYTE.POINTER! = BYTE.POINTER! + 14
  3792.       GOSUB 64630
  3793.       TOTAL.BYTES# = WORK.BYTES#
  3794.       BYTE.POINTER! = BYTE.POINTER! + 10
  3795.       GOSUB 64630
  3796.       FINAL.BYTES# = WORK.BYTES#
  3797.       A$ = A$ + SPACE$(20-LEN(ARCED.NAME$) - LEN(STR$(FINAL.BYTES#))) _
  3798.               + STR$(FINAL.BYTES#) _
  3799.               + " bytes."
  3800.       CALL QTPUT(A$,1)
  3801.       BYTE.POINTER! = BYTE.POINTER! + TOTAL.BYTES# + 4
  3802.       GOTO 64605
  3803. 64620 CLOSE 2
  3804.       SUBROUTINE.PARAMETER = 0
  3805.       CALL CARRIER
  3806.       A$ = ""
  3807.       EXIT SUB
  3808. 64630 FACTOR# = 1#
  3809.       WORK.BYTES# = 0
  3810.       FOR X = 0 TO 3
  3811.           GET 2,BYTE.POINTER! + X
  3812.           WORK.BYTES# = WORK.BYTES# + FACTOR# * ASC(CHAR$)
  3813.           FACTOR# = FACTOR# * 256#
  3814.       NEXT
  3815.       RETURN
  3816.       END SUB
  3817.